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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1584 - (show annotations)
Tue Aug 12 16:13:59 2003 UTC (21 years, 7 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 250746 byte(s)
update of about-info

1 2003-08-12 Jan-Oliver Wagner <[email protected]>
2
3 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4
5 2003-08-12 Bernhard Herzog <[email protected]>
6
7 * po/de.po: New. German translations by Bjoern Broscheit
8
9 2003-08-12 Bernhard Herzog <[email protected]>
10
11 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
12 strings have to be one string literal.
13
14 2003-08-11 Bernhard Herzog <[email protected]>
15
16 * test/support.py (FloatComparisonMixin.assertPointListEquals):
17 New. This method was used in various derived classes, but it's
18 better to have it here.
19
20 * test/test_shapefilestore.py
21 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
22 FloatComparisonMixin
23
24 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
25 It's now in FloatComparisonMixin
26
27 * test/test_derivedshapestore.py
28 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
29 in FloatComparisonMixin
30
31 2003-08-11 Bernhard Herzog <[email protected]>
32
33 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
34 error message
35
36 2003-08-08 Jan-Oliver Wagner <[email protected]>
37
38 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
39 with version number.
40 Changed title to reflect version number of Thuban.
41
42 2003-08-08 Jan-Oliver Wagner <[email protected]>
43
44 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
45 the list corresponds to the "About" web page.
46
47 2003-08-08 Bernhard Herzog <[email protected]>
48
49 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
50 Make sure translated strings are recognized as one string literal.
51
52 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
53 Make sure translated strings are recognized as one string literal.
54
55 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
56 translated strings are recognized as one string literal.
57
58 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
59 sure translated strings are recognized as one string literal.
60
61 2003-08-07 Bernhard Herzog <[email protected]>
62
63 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
64 Simply delegates to the original shapestore.
65
66 * test/test_derivedshapestore.py
67 (TestDerivedShapeStore.test_raw_format): New. Test case for
68 DerivedShapeStore.RawShapeFormat
69
70 2003-08-07 Bernhard Herzog <[email protected]>
71
72 Add raw data interface to shape objects.
73
74 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
75 class to ShapefileShape which now holds shapefile specific
76 information.
77 (ShapefileShape.compute_bbox): Simplified to not cache any
78 information. The way this method is used that shouldn't matter
79 performance wise.
80 (ShapefileShape.RawData): New. Return the shapeid which is the raw
81 data format for shapes from shapefiles.
82 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
83 in the shape objects returned by a shapestore. For a
84 ShapefileStore this is always RAW_SHAPEFILE.
85 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
86 method.
87
88 * test/test_shapefilestore.py
89 (TestShapefileStore.test_raw_format): New test to test the raw
90 format feature of shapes.
91
92 * Thuban/Model/layer.py: Remove the unused import of Shape from
93 data. It was only there for interface compatibility but it's not
94 used inside of Thuban and the generic Shape class has gone away.
95
96 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
97 the raw data format and only use an optimized version of its a
98 shapefile.
99
100 2003-08-07 Bernhard Herzog <[email protected]>
101
102 * test/test_baserenderer.py (SimpleShape): Shape class for the
103 tests.
104 (SimpleShapeStore.Shape): Use SimpleShape instead of
105 Thuban.Model.data.Shape to make the tests independed of the coming
106 changes.
107
108 2003-08-07 Bernhard Herzog <[email protected]>
109
110 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
111 (ThubanTestProgram): New classes that extend the respective
112 classes from unittest. These new version support skipping tests
113 under certain expected conditions. In the Thuban test suite we
114 uses this for tests that require the optional gdal support.
115 (run_tests): Use ThubanTestProgram instead of the unittest.main()
116
117 * test/runtests.py (main): Use the new ThubanTestRunner instead of
118 the normal one from unittest
119
120 * test/test_layer.py (TestLayer.test_raster_layer): If this test
121 is not run because gdal support isn't available report this to the
122 runner.
123
124 * test/test_baserenderer.py
125 (TestBaseRenderer.test_raster_no_projection): Do not run this test
126 if gdal support isn't available and report this to the runner.
127
128 2003-08-06 Bernhard Herzog <[email protected]>
129
130 Rearrange the renderers a bit, partly in preparation for changes
131 required for the postgis merge, partly to make it more testable.
132 Also make the representation of coordinates in Shapes more
133 consistent.
134
135 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
136 this class is now in BaseRenderer. This class is now practically
137 only a specialization of BaseRenderer for rendering to an actual
138 wx DC.
139 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
140 to get the shapetype specific rendering functions.
141
142 * Thuban/UI/baserenderer.py: New file with the basic rendering
143 logic. The code in this file is completely independend of wx.
144 (BaseRenderer): Class with the basic rendering logic
145
146 * test/test_baserenderer.py: New. Test cases for BaseRenderer
147
148 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
149 error_on_redraw to guard agains endless loops and stack overflows
150 when there's a bug in the rendering code that raises exceptions.
151 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
152 rendering into a separate method _do_redraw so that error handling
153 is a bit easier. When an exception occurs, set error_on_redraw to
154 true. When it's true on entry to OnIdle do nothing and return
155 immediately.
156
157 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
158 Shape object will always have the coordinates as a list of list of
159 coordinate pairs (tuples).
160 (Shape.compute_bbox): Adapt to new representation.
161
162 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
163 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
164 Shape objects.
165
166 * test/test_shapefilestore.py
167 (ShapefileStoreTests.assertFloatTuplesEqual)
168 (ShapefileStoreTests.assertPointListEquals): Rename to
169 assertPointListEquals and change purpose to checking equality of
170 the lists returned by Shape.Points().
171 (TestShapefileStoreArc.test_shape)
172 (TestShapefileStorePolygon.test_shape)
173 (TestShapefileStorePoint.test_shape): Use the new
174 assertPointListEquals instead of assertFloatTuplesEqual
175
176 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
177 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
178 and change purpose to checking equality of the lists returned by
179 Shape.Points().
180 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
181 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
182 (TestLayer.test_derived_store): Use the new assertPointListEquals
183 instead of assertFloatTuplesEqual
184
185 * test/test_derivedshapestore.py
186 (TestDerivedShapeStore.assertFloatTuplesEqual)
187 (TestDerivedShapeStore.assertPointListEquals): Rename to
188 assertPointListEquals and change purpose to checking equality of
189 the lists returned by Shape.Points().
190 (TestDerivedShapeStore.test_shape): Use the new
191 assertPointListEquals instead of assertFloatTuplesEqual
192
193 2003-08-06 Jan-Oliver Wagner <[email protected]>
194
195 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
196 a bounding box. A dialog is raised in case, no bounding box
197 is found. This fixes bug #2043:
198 https://intevation.de/rt/webrt?serial_num=2043
199
200 2003-08-05 Bernhard Herzog <[email protected]>
201
202 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
203 object look like a Color instantiation. Formerly it looked like a
204 tuple.
205
206 * test/test_color.py (TestColor.test_repr)
207 (TestColor.test_equality, TestColor.test_inequality): New. test
208 some more apects of the Color class
209 (TestTransparent.test_repr, TestTransparent.test_hex)
210 (TestTransparent.test_equality): New. Test cases for the
211 Transparent object.
212
213 2003-08-04 Jan-Oliver Wagner <[email protected]>
214
215 * Doc/manual/thuban-manual.xml: a number of small improvements.
216 The resulting file is the version submitted for GREAT-ER II.
217
218 2003-08-01 Bernhard Herzog <[email protected]>
219
220 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
221 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
222 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
223
224 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
225 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
226 (ThubanEndBusyCursor): Add doc-strings
227
228 2003-08-01 Bernhard Herzog <[email protected]>
229
230 First step towards PostGIS integration. More abstraction by movin
231 more code from the layer to the shapestore. More methods of the
232 layer are now simply delegated to the equivalent method of the
233 shapestore. The SHAPETYPE_* constants are now in data not in
234 layer.
235
236 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
237 (SHAPETYPE_POINT, Shape): Move these constants and classes from
238 layer.py to data.py
239 (ShapefileStore.__init__): More Initialization for the new methods
240 and functionality.
241 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
242 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
243 (ShapefileStore.Shape): New methods that were formerly implemented
244 in the layer.
245 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
246 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
247 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
248 equivalents of the new shape methods. These versions are simply
249 delegated to the original shapstore.
250
251 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
252 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
253 (Layer.SetShapeStore): Removed the initializatin of instance
254 variables that were needed for the stuff that's now in
255 ShapefileStore
256 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
257 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
258 shapestore.
259
260 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
261 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
262 instead of layer.
263
264 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
265
266 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
267
268 * test/test_layer.py: Import the SHAPETYPE_* constants from data
269 instead of layer.
270 (TestLayer.test_derived_store): Remove the test for the exception
271 when instantiating the DerivedShapeStore with an incompatible
272 table which is now in test_derivedshapestore.py. Add some more
273 tests of the layer methods to determine whether they work for a
274 DerivedShapeStore as well.
275
276 2003-07-31 Jonathan Coles <[email protected]>
277
278 * Doc/manual/thuban-manual.xml: Fix the list of required packages
279 by just listing the name and where they can be found.
280
281 2003-07-31 Frank Koormann <[email protected]>
282
283 * Doc/manual/thuban-manual.xml:
284 Changed the screenshot elements to figure.
285 Changed some variablelist elements to itemizedlist.
286 Added section on GDAL formats.
287
288 2003-07-31 Jonathan Coles <[email protected]>
289
290 * Doc/manual/thuban-manual.xml: Added a few sentences about
291 the Fix Border Color option when generating classes.
292
293 2003-07-30 Jonathan Coles <[email protected]>
294
295 * Thuban/Model/classgen.py: Add docstrings. Rename specific
296 Ramp instances to use lower_case_style.
297
298 * Thuban/UI/classgen.py: Use renamed Ramp instances.
299
300 * Thuban/UI/classifier.py: Add docstrings.
301
302 * Thuban/UI/dock.py: Add docstrings.
303
304 * test/test_classgen.py: Use renamed Ramp instances.
305
306 2003-07-30 Bernhard Herzog <[email protected]>
307
308 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
309 was never used in Thuban.
310
311 2003-07-30 Bernhard Herzog <[email protected]>
312
313 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
314 method directly instead of going through the transient_table
315 method. This faster because transient_table may force the copy of
316 a DBF file into the transient database and setting a table's title
317 doesnm't affect the title of the associated transient table, so
318 this fixes RT #2042
319
320 * Thuban/UI/main.py (__version__): Don't import the already
321 removed show_exception_dialog.
322
323 2003-07-29 Jonathan Coles <[email protected]>
324
325 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
326 Put back this method and remove the equivalent function since we
327 are setting the exception hook from within this class (OnInit).
328
329 2003-07-29 Jonathan Coles <[email protected]>
330
331 * Doc/manual/images/5_2_custom_ramp.png,
332 Doc/manual/images/5_2_quantiles.png,
333 Doc/manual/images/5_2_uniform_dist.png,
334 Doc/manual/images/5_2_unique_values.png,
335 Doc/manual/images/8_int_error.png: New screen shots.
336
337 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
338 some points, and added more screen shots.
339
340 2003-07-29 Bernhard Herzog <[email protected]>
341
342 * Thuban/Model/data.py: Remove the now unused import of warnings
343
344 2003-07-29 Bernhard Herzog <[email protected]>
345
346 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
347 deprecated since before the 0.8 release and isn't used in Thuban
348 itself anymore.
349
350 * Thuban/Model/transientdb.py: Remove some unnecessary imports
351
352 2003-07-29 Jonathan Coles <[email protected]>
353
354 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
355 python exception hook here so that we are sure to catch any
356 Thuban exception that happen during initialization.
357
358 * Thuban/UI/main.py (main): Don't set the exception hook here,
359 it will get set in ThubanApplication.OnInit.
360
361 2003-07-29 Jonathan Coles <[email protected]>
362
363 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
364 Removed and called it show_exception_dialog() so that the exception
365 handler can be set before the class is created.
366
367 * Thuban/UI/main.py (main): Install the exception handler before
368 a ThubanApplication is created.
369
370 2003-07-29 Bernhard Herzog <[email protected]>
371
372 * po/it.po: New. Italian translation by Maurizio Napolitano
373
374 * po/ru.po: New. Russian translation by Alex Shevlakov
375
376 2003-07-29 Frank Koormann <[email protected]>
377
378 * Doc/manual/thuban-manual.xml: Extended section on supported
379 projections.
380
381 2003-07-29 Frank Koormann <[email protected]>
382
383 * Doc/manual/thuban-manual.xml: gaspell-checked.
384
385 2003-07-29 Jonathan Coles <[email protected]>
386
387 * Doc/manual/images/3_5_legend.png: Added border to improve look
388 on white background.
389
390 2003-07-29 Jonathan Coles <[email protected]>
391
392 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
393 descriptions for the legend toolbar.
394
395 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
396 cursor from dialog box.
397
398 2003-07-28 Jonathan Coles <[email protected]>
399
400 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
401
402 * Doc/manual/images/2_4_session_tree.png,
403 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
404 Doc/manual/images/4_2_layer_properties.png,
405 Doc/manual/images/4_2_raster_layer_properties.png,
406 Doc/manual/images/5_3_genclass.png,
407 Doc/manual/images/5_classification.png,
408 Doc/manual/images/6_projection.png,
409 Doc/manual/images/7_1_table_view.png,
410 Doc/manual/images/7_2_5_join.png: New screenshots.
411
412 2003-07-24 Jonathan Coles <[email protected]>
413
414 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
415
416 2003-07-24 Jonathan Coles <[email protected]>
417
418 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
419 chapter on Layer Management.
420
421 * Doc/manual/Makefile: New. Makefile to generate all formats for the
422 manual and images.
423
424 2003-07-24 Bernhard Herzog <[email protected]>
425
426 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
427 it annoys lintian which warns about these files not being
428 executable. The #1 isn't necessary here since if you absolutely
429 must execute them you can always say "python <filename>".
430
431 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
432 superfluous code to set brush and pen for point shapes
433
434 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
435 belong in viewport anyway
436
437 2003-07-24 Frank Koormann <[email protected]>
438
439 * Doc/manual/thuban-manual.xml: Added section on table management.
440
441 2003-07-24 Bernhard Herzog <[email protected]>
442
443 * test/runtests.py (main): Recognize the long "verbose" option
444 correctly.
445
446 2003-07-22 Jonathan Coles <[email protected]>
447
448 * Doc/manual/thuban-manual.xml: Continue to write first revision
449 of the manual.
450
451 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
452 with Begin/EndDrawing() calls to ensure we aren't doing to
453 many updates to the dc during rendering.
454 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
455 a pen and brush argument so they need to be passed to the function.
456
457 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
458 Calculates the minimum and maximum scale values. Factored out
459 of set_view_transform so that it could be used to zoom all the
460 way into a single point.
461 (ViewPort.set_view_transform): Call calc_min_max_scales().
462 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
463 if only a single point is selected.
464
465 * Doc/manual/images/1_2_legend_close.png,
466 Doc/manual/images/1_2_legend_dock.png,
467 Doc/manual/images/1_2_mainwindow.png,
468 Doc/manual/images/1_2_mainwindow.ps,
469 Doc/manual/images/1_2_mainwindow.sk,
470 Doc/manual/images/3_2_fullextent.png,
471 Doc/manual/images/3_2_fulllayerextent.png,
472 Doc/manual/images/3_2_fullshapeextent.png,
473 Doc/manual/images/3_2_pan.png,
474 Doc/manual/images/3_2_zoomin.png,
475 Doc/manual/images/3_2_zoomout.png,
476 Doc/manual/images/3_3_identify.png,
477 Doc/manual/images/3_3_label.png,
478 Doc/manual/images/3_5_invisible.png,
479 Doc/manual/images/3_5_movedown.png,
480 Doc/manual/images/3_5_moveup.png,
481 Doc/manual/images/3_5_props.png,
482 Doc/manual/images/3_5_tobottom.png,
483 Doc/manual/images/3_5_totop.png,
484 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
485
486 2003-07-18 Bernhard Herzog <[email protected]>
487
488 * Thuban/UI/messages.py (MAP_REPLACED): New message.
489
490 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
491 after the new map has been assigned
492
493 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
494 Delegate MAP_REPLACED to the canvas too
495 (MainWindow.prepare_new_session): Removed. Thanks to the new
496 MAP_REPLACED message it's no longer needed
497 (MainWindow.OpenSession, MainWindow.NewSession):
498 prepare_new_session has been removed.
499
500 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
501 MAP_REPLACED so that we can close the dialog if a new map is set.
502 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
503 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
504 dialog
505
506 * test/test_viewport.py (SimpleViewPortTest)
507 (SimpleViewPortTest.test_default_size): Add doc-strings
508 (ViewPortTest.setUp): Bind map to self.map so we can use it in
509 tests. Subscribe to MAP_REPLACED messages too.
510 (ViewPortTest.tearDown): No need to explicitly unsubscribe
511 (ViewPortTest.test_set_map): New test for the SetMap method.
512
513 2003-07-18 Bernhard Herzog <[email protected]>
514
515 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
516 Move this test from ViewPortTest.setUp to this new separate test
517 case. setUp is not the place for the actual tests.
518 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
519 more of the test from setUp to the new test test_inital_settings.
520 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
521 (ViewPortTest.test_proj_conv): Split test_proj_conv into
522 test_win_to_proj and test_proj_to_win and make the tests easier to
523 understand
524 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
525 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
526 (ViewPortTest.test_unprojected_rect_around_point)
527 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
528 Reformat to increase readability.
529
530 2003-07-18 Bernhard Herzog <[email protected]>
531
532 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
533
534 2003-07-18 Bernhard Herzog <[email protected]>
535
536 * test/runtests.py: The test suite can now be run without an X
537 connection. To make sure this remains true, remove the DISPLAY
538 environment variable so that an error occurs if the wxGTK is
539 imported accidentally
540
541 2003-07-18 Bernhard Herzog <[email protected]>
542
543 * Thuban/UI/viewport.py: Remove unused imports
544
545 * Thuban/UI/view.py: Remove unused imports
546
547 2003-07-18 Bernhard Herzog <[email protected]>
548
549 * test/test_export.py Remove unused imports. The OutputTransform
550 function is now in viewport.py and is called output_transform
551 (TestScalebar.test_output_transform)
552 (TestScalebar.test_OutputTransform): Renamed to
553 test_output_transform and updated to use output_transform instead
554 of OutputTransform
555
556 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
557 renamed.
558 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
559 renamed to output_transform
560
561 * Thuban/UI/viewport.py (OutputTransform, output_transform):
562 Rename to output_transform
563
564 2003-07-18 Bernhard Herzog <[email protected]>
565
566 * Thuban/Model/layer.py (Layer.__init__): Rename
567 classificationField to classificatin_column and init it here so
568 that it can be used in SetClassificationColumn
569 (Layer.GetClassificationColumn, Layer.GetClassificationField):
570 Rename to GetClassificationColumn.
571 (Layer.SetClassificationColumn, Layer.SetClassificationField):
572 Rename to SetClassificationColumn and issue a LAYER_CHANGED
573 message if the column changes.
574 (Layer._classification_changed, Layer.ClassChanged): Rename to
575 _classification_changed. Update the callers.
576 (Layer.SetShapeStore): Further field->column renames.
577
578 * Thuban/Model/load.py (SessionLoader.start_classification)
579 (SessionLoader.start_clpoint): Updates because of
580 field->column method name changes in the Layer class
581
582 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
583 because of field->column method name changes in the Layer class
584
585 * Thuban/UI/classifier.py (Classifier.__init__)
586 (Classifier._OnTry, Classifier._OnRevert): Updates because of
587 field->column method name changes in the Layer class
588
589 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
590 because of field->column method name changes in the Layer class
591
592 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
593 of field->column method name changes in the Layer class
594
595 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
596 (SaveSessionTest.testClassifiedLayer): Update because of
597 field->column method name changes in the Layer class
598
599 * test/test_layer.py (SetShapeStoreTests.setUp)
600 (SetShapeStoreTests.test_sanity): Update because of field->column
601 method name changes in the Layer class
602 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
603 (TestLayerModification.test_sanity)
604 (TestLayerModification.test_initial_settings): remove unsued code
605 and rename to test_sanity.
606 (TestLayerModification.test_set_classification): New test for
607 SetClassification and SetClassificationField.
608
609 2003-07-18 Bernhard Herzog <[email protected]>
610
611 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
612 the non-fixed values as well. The old test would have accepted a
613 fixed ramp that only returnes the fixed properties
614
615 2003-07-17 Jonathan Coles <[email protected]>
616
617 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
618 shots for the manual. The XCF file is the source image and
619 has additional layers to support changes.
620
621 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
622
623 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
624 Return both the new class and the field name.
625
626 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
627 fit the map to the window as this changes any zoom level that
628 the user may have set.
629
630 2003-07-16 Jonathan Coles <[email protected]>
631
632 * Thuban/Model/classgen.py (generate_singletons,
633 generate_uniform_distribution, generate_quantiles): Remove
634 fixes parameter, but maintain the same functionality by having
635 the calling function pass a FixedRamp object for the ramp.
636 (FixedRamp): New. Adapts a ramp to have fixed property values.
637
638 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
639 (Classification): Inherit from Publisher.
640 (Classification.__init__): Remove the layer parameter.
641 Classifications no longer need to have a parent layer.
642 (Classification.GetField, Classification.GetFieldType,
643 Classification.SetFieldInfo): Removed. The field name is stored
644 in the layer, and the type can be retreived by calling
645 Layer.GetFieldType().
646 (Classification._set_layer, Classification.GetLayer): Removed.
647 Classifications no longer have a parent layer.
648
649 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
650 classification.
651 (Layer.SetShapeStore): Reset the classification first while
652 we still have the old shape store to work with.
653 (Layer.GetClassificationField, Layer.SetClassificationField):
654 New. Method for getting/setting the field to classify on.
655 (Layer.SetClassification): Simplified now that the layer
656 simply has to hold a reference to the classification and not
657 tell the classification who owns it.
658 Fixes RTbug #2023.
659
660 * Thuban/Model/load.py (SessionLoader.start_classification):
661 Set the field name on the layer, not the classification.
662
663 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
664 classification is modified.
665
666 * Thuban/Model/save.py (SessionSaver.write_classification):
667 Get the field name and type from the layer.
668
669 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
670 parameter records to rows and add docstring. Fixes RTbug #1997.
671
672 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
673 ramp when we need to fix certain values of a ramp rather than
674 using the old fixes parameter. Fixes RTbug #2024.
675
676 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
677 parameter.
678 (ClassTable.Reset): Add fieldType parameter and use it, rather
679 than asking the classification.
680 (Classifier.__init__): Remember the original class's field
681 and ask the layer for the field type, rather than the classification.
682 (Classifier.__SetGridTable): Retrieve the field and field type
683 for the table because they are not in the classification.
684 (Classifier._OnTry, Classifier._OnRevert): Set the classification
685 field on the layer in addition to the classification itself.
686
687 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
688 classification field from layer.
689
690 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
691 classification field from layer. Split up tests and remove
692 *-imports. Fixes RTbug #1992.
693
694 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
695
696 * test/test_classification.py
697 (TestClassification.test_classification): Remove tests for methods
698 that no longer exist.
699
700 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
701 __init__ no longer has a field parameter, use SetClassificationField.
702 (SetShapeStoreTests.test_sanity): Use layer object to get class
703 field info.
704
705 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
706 SetClassificationField on layer to set class field info.
707
708 * test/test_viewport.py: Renamed from test/test_view.py.
709
710 2003-07-16 Jan-Oliver Wagner <[email protected]>
711
712 * Doc/manual/thuban-manual.xml: Added authors and an initial
713 coarse structure.
714
715 2003-07-15 Bernhard Herzog <[email protected]>
716
717 * test/support.py (FloatComparisonMixin): This is a mix-in class
718 and therefore should not be derived from any other class.
719
720 * test/test_range.py (RangeTest): FloatComparisonMixin is a
721 mix-in, so derive from TestCase as well.
722
723 2003-07-15 Bernhard Herzog <[email protected]>
724
725 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
726 draw_func handling a bit to remove one layer of indirection. This
727 makes the renderer about 10% faster in the non-classifying case
728 and the code a bit cleaner
729 (MapRenderer.draw_point_shape): Add the pen and brush parameters
730 and set them in the dc. Now the draw_point_shape method and
731 wxproj's draw_polygon_shape function have basically the same
732 signature so that both can be directly used as draw_func
733
734 2003-07-15 Bernhard Herzog <[email protected]>
735
736 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
737 string values (in addition to the labels) as UTF 8
738
739 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
740 values if the field type is string
741
742 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
743 saving a session with non-ascii string classification values.
744
745 * test/test_load.py (TestClassification.file_contents)
746 (TestClassification.test): Check for non-ascii values in string
747 classifications
748
749 2003-07-14 Jonathan Coles <[email protected]>
750
751 * test/test_view.py: New. Tests for ViewPort.
752
753 2003-07-14 Frank Koormann <[email protected]>
754
755 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
756 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
757
758 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
759 unicode strings from session file: session title, map title and
760 projection name.
761
762 2003-07-10 Jonathan Coles <[email protected]>
763
764 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
765 drag_stop, not drag_move when the mouse is released.
766
767 2003-07-10 Jonathan Coles <[email protected]>
768
769 The most important part of this is the seperation of view.py into
770 two pieces. viewport.py now has a class called ViewPort which
771 contains all the non-wx parts of view.py and can therefore be
772 tested. view.py contains only the wx-specific parts and is fairly
773 simple.
774
775 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
776 RTTbug #1992.
777 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
778 RTTbug #1992.
779
780 * Thuban/Model/classgen.py (generate_singletons,
781 generate_uniform_distribution, generate_quantiles):
782 Added 'fixes' parameter so that property attributes can
783 be held constant over the generated classification groups.
784 (CustomRamp.GetProperties): Remove unused variables.
785
786 * Thuban/Model/map.py (Map.SetProjection): Send the old
787 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
788 event.
789
790 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
791 parameter which is a list of records that restricts which
792 records are saved. Fixes RTbug #1997.
793
794 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
795 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
796
797 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
798 to allow the user to fix line color/width on generated groups.
799 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
800 functions to optionally fix group properties.
801
802 * Thuban/UI/main.py (main): Set exception hook to the
803 ShowExceptionDialog. Fixes RTbug #1993.
804
805 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
806 the table window when it is selectd to be shown.
807
808 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
809 Export Selection button and move the export buttons underneath
810 the table.
811 (QueryTableFrame.UpdateStatusText): Added event argument so
812 that it can respond to grid selection events. The status text
813 is now updated even when the table is not associated with a
814 layer as was previously assumed.
815 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
816 UpdateStatusText responds to these events.
817 (QueryTableFrame.OnSaveAs): Renamed to doExport.
818 (QueryTableFrame.doExport): Helper function that saves the
819 entire table, or selected rows, to a file.
820 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
821 Respond to export button events and call doExport.
822
823 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
824 the function doesn't return NULL without first setting a Python
825 Error.
826
827 * test/runtests.py (main): Only print "Unknown option" for
828 unsupported options.
829
830 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
831 optional epsilon argument to specify floating point accuracy.
832 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
833 for each item test.
834
835 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
836 tests for saving selected records.
837
838 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
839 tests for saving selected records.
840
841 * test/test_map.py (TestMapWithContents.test_set_projection):
842 MAP_PROJECTION_CHANGED events send the old projection.
843
844 * test/test_session.py
845 (TestSessionWithContent.test_forward_map_projection):
846 MAP_PROJECTION_CHANGED events send the old projection.
847
848 * test/test_table.py (TableTest): Update tests to use non-deprecated
849 functions.
850
851 2003-07-08 Bernhard Herzog <[email protected]>
852
853 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
854 constants in the column objects are the standard ones defined in
855 the table module.
856
857 * test/test_transientdb.py
858 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
859 exporting transient tables as DBF works. This should catch the bug
860 just fixed in TransientTableBase.Width.
861
862 2003-07-08 Bernhard Herzog <[email protected]>
863
864 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
865 interpolated colors correctly.
866
867 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
868 New. Test case for the fix in classgen.py
869
870 2003-07-08 Bernhard Herzog <[email protected]>
871
872 * test/runtests.py (main): Make the default output less verbose
873 and add a verbosity option (-v) to get the old output
874
875 2003-07-08 Bernhard Herzog <[email protected]>
876
877 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
878 0.9.
879
880 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
881 New. Return the join type
882
883 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
884 DTD
885 (SessionSaver.write_data_containers): Save the join type for
886 joined tables
887
888 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
889 namespace
890 (SessionLoader.start_jointable): Handle the jointype attribute
891
892 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
893 as of Thuban 0.8. These are now tests to determine whether Thuban
894 can still read files generated by Thuban 0.8
895
896 * test/test_load.py (LoadSessionTest.dtd)
897 (TestSingleLayer.file_contents)
898 (TestLayerVisibility.file_contents, TestLabels.file_contents)
899 (TestLayerProjection.file_contents)
900 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
901 (TestJoinedTable.file_contents)
902 (TestLoadError.file_contents): Update for new DTD
903 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
904 for new join type attribute
905
906 * test/test_save.py (SaveSessionTest.dtd)
907 (SaveSessionTest.testEmptySession)
908 (SaveSessionTest.testSingleLayer)
909 (SaveSessionTest.testLayerProjection)
910 (SaveSessionTest.testRasterLayer)
911 (SaveSessionTest.testClassifiedLayer)
912 (SaveSessionTest.test_dbf_table)
913 (SaveSessionTest.test_joined_table): Update for new DTD
914 (SaveSessionTest.test_joined_table): Add test for new join type
915 attribute
916
917 2003-07-04 Bernhard Herzog <[email protected]>
918
919 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
920 function for table_to_dbf
921 (table_to_dbf): Deal with names longer than the 10 character limit
922
923 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
924 doc-string
925 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
926 long column names
927
928 2003-07-03 Bernhard Herzog <[email protected]>
929
930 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
931
932 2003-07-03 Bernhard Herzog <[email protected]>
933
934 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
935 for the Thuban manual and README with some basic information about
936 the manual
937
938 2003-07-03 Bernhard Herzog <[email protected]>
939
940 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
941 Update doc-string
942 (TransientJoinedTable.create): Do not modify the column objects of
943 the input tables in place and copy all columns of the input tables
944 into the joined table after all.
945
946 * test/test_transientdb.py
947 (TestTransientTable.test_transient_joined_table_same_column_name):
948 Update to reflect the new behavior
949 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
950 Update to reflect the new behavior
951 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
952 New test case for a bug which modified the column objects in place
953
954 2003-07-02 Jonathan Coles <[email protected]>
955
956 * Thuban/Model/classgen.py (generate_singletons,
957 generate_uniform_distribution, generate_quantiles,
958 GenQuantiles0): Make sure maxValue isn't less than
959 one, otherwise we could divide by zero.
960
961 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
962 ClassGenTest.doClassSingleTest): Call doBoundsTest to
963 check the end classification groups against the
964 proper property values.
965 (ClassGenTest.doBoundsTest): New. Checks the first and
966 last classification groups to make sure their properties
967 are the correct upper and lower bounds for a color ramp.
968
969 2003-07-02 Jonathan Coles <[email protected]>
970
971 * Thuban/Model/classgen.py (generate_singletons,
972 generate_uniform_distribution, generate_quantiles,
973 GenQuantiles0): The denominator was one to high when
974 calculating the index for the ramp causing the index
975 to never to reach one.
976
977 2003-07-02 Jonathan Coles <[email protected]>
978
979 Changed the singature of ClassGroupRange.__init__ and
980 ClassGroupRange.SetRange() so that the min/max values are
981 passed as a tuple. This makes a better calling scheme for
982 when a Range object is passed instead.
983
984 * Thuban/Model/classgen.py: Fixed parameters to
985 ClassGroupRange constructor.
986
987 * Thuban/Model/classification.py (ClassGroupRange.__init__):
988 Consolidate the min/max parameters into a single _range which
989 can either be a tuple or a Range object.
990 (ClassGroupRange.SetRange): Consolidate the min/max parameters
991 into a single _range which can either be a tuple or a Range object.
992
993 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
994 call to ClassGroupRange constructor to use a tuple.
995
996 * Thuban/Model/layer.py (Layer.SetClassification): Switch
997 the classification instance variable to the new class
998 before calling _set_layer otherwise subscribers to a
999 LAYER_CHANGED event will not see any difference.
1000
1001 * test/test_classification.py: Fix tests of ClassGroupRange
1002 so that they use the new signature.
1003
1004 * test/test_load.py: Fix use of ClassGroupRange so that it
1005 uses the new signature.
1006
1007 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
1008 uses the new signature.
1009
1010 * test/test_save.py: Fix use of ClassGroupRange so that it
1011 uses the new signature.
1012
1013
1014 2003-07-01 Jonathan Coles <[email protected]>
1015
1016 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
1017 Import used objects/class from color.
1018 (generate_singletons): We don't
1019 need the numGroups parameter anymore because we are using
1020 the new ramps with GetProperties().
1021 (generate_uniform_distribution): Use new ramp method
1022 GetProperties().
1023 (generate_quantiles, GenQuantiles0): Use new ramp method
1024 GetProperties().
1025 (CustomRamp.SetNumGroups): Removed. The ramps now map
1026 a value from 0 to 1 to class properties so the number
1027 of groups is not needed ahead of time.
1028 (CustomRamp.next): Removed. CustomRamp does not support
1029 interation anymore.
1030 (CustomRamp.GetProperties): Returns a ClassGroupProperties
1031 object based on the index value from 0 to 1 that is
1032 passed to it.
1033 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
1034 Made into instances of Monochromatic class instread of
1035 deriving from it.
1036 (HotToCold.SetNumGroups): Removed. See CustomRamp.
1037 (HotToCold.next): Removed. See CustomRamp.
1038
1039 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
1040 (Classification.SetField, Classification.SetFieldType):
1041 Replaced with SetFieldInfo.
1042 (Classification.SetFieldInfo): New. Does a better job of
1043 what SetField and SetFieldType used to do by combining
1044 their function since they should really always be done
1045 at the same time.
1046 (Classification.SetLayer): Renamed to _set_layer.
1047 (Classification._set_layer): Should only be called from
1048 Layer's SetClassification. This does not cause a recursive
1049 call as SetLayer did because we know that Layer knows about
1050 the classification.
1051
1052 * Thuban/Model/color.py: Fixes RTbug #1971.
1053 (_Transparent): Renamed from Transparent so it doesn't
1054 conflict with the module variable.
1055 (Transparent, Black): Renamed from Color.Transparent,
1056 Color.Black so they are not class variables.
1057
1058 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
1059 (Layer.Destroy): We don't need to call SetClassification
1060 anymore to clear out the back reference in the classifcation
1061 to the layer. It's better to set it to None using _set_layer,
1062 and we won't be creating another clas object too.
1063 (Layer.SetClassification): Classification._set_layer is not
1064 recursive so remove all the locking variables. Also clean
1065 up the code so that it remains unchanged if something fails.
1066
1067 * Thuban/Model/load.py: Fixes RTbug #1971.
1068 (SessionLoader.start_classification): Call
1069 Classification.SetFieldInfo().
1070
1071 * Thuban/Model/save.py: Removed import of Color which wasn't
1072 being used.
1073
1074 * Thuban/UI/classgen.py: Fixes RTbug #1972.
1075 (ClassGenDialog.__init__): Color ramps are now instances
1076 already so we don't need to create any new objects.
1077 (ClassGenDialog.OnOK): Check for numGroups is no longer
1078 necessary because we never use it.
1079
1080 * Thuban/UI/classifier.py: Fixes RTbug #1971.
1081 (Classifier.__BuildClassification, Classifier.__SetGridTable):
1082 Call Classification.SetFieldInfo() instead of SetFieldType.
1083
1084 * Thuban/UI/renderer.py: Fixes RTbug #1971.
1085
1086 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
1087 (MapCanvas.__init__): Subscribe to the idle time event. Set
1088 background color to white.
1089 (MapCanvas.OnPaint): Set a flag indicating that we should
1090 render the map during idle time. If we already have a bitmap
1091 just draw it now.
1092 (MapCanvas.OnIdle): New. Render the map only during idle time.
1093 This also fixes a problem with the busy cursor under gtk.
1094
1095 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
1096 Fix calls to generate_singletons because the signature changed.
1097
1098 * test/test_classification.py: Fix color references and
1099 change calls to Classification.[SetField|SetFieldType] to
1100 SetFieldInfo.
1101
1102 * test/test_load.py: Fix color references.
1103
1104 * test/test_load_0_2.py: Fix color references.
1105
1106 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
1107 Change calls to Classification.[SetField|SetFieldType] to
1108 SetFieldInfo.
1109
1110 2003-07-01 Frank Koormann <[email protected]>
1111
1112 MERGE from the greater-ms3 branch.
1113
1114 * test/test_transientdb.py
1115 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
1116 New. Test join of two tables with partly equal column names.
1117
1118 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
1119 If duplicates in left and right tables column names are found,
1120 append '_' (underscores) to the name until it is unique.
1121 Create always new internal names for the resulting table and reference
1122 columns in the join statement with <table>.<column>
1123
1124 2003-07-01 Bernhard Herzog <[email protected]>
1125
1126 * test/test_transientdb.py
1127 (TestTransientTable.test_transient_joined_table_same_column_name):
1128 New. Test whether joining on columns with the same names in both
1129 tables works.
1130
1131 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
1132 sure to use the right internal names even when joining on field
1133 with the same names in both tables. Also, detect duplicate names
1134 in the joined table correctly.
1135
1136 2003-07-01 Frank Koormann <[email protected]>
1137
1138 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1139 Reverse List of layers to render in same order as in desktop legend.
1140
1141 2003-06-30 Jonathan Coles <[email protected]>
1142
1143 * Thuban/version.py (make_tuple): Takes a version string
1144 and splits it into a tuple of at most three integers.
1145 Used make_tuple() to make tuple versions of the version
1146 numbers.
1147
1148 * Thuban/UI/about.py: Add Thuban email addresses.
1149
1150 2003-06-30 Jonathan Coles <[email protected]>
1151
1152 * Thuban/version.py: SQLite/PySQLite version dependencies
1153 were too high.
1154
1155 2003-06-30 Jonathan Coles <[email protected]>
1156
1157 * Thuban/version.py: Update version to 0.8.1
1158
1159 * MANIFEST.in: Added Projections so that default.proj is
1160 included.
1161
1162 2003-06-26 Jonathan Coles <[email protected]>
1163
1164 New About box with lots more information including library
1165 versions and credits. More/better version checking before
1166 Thuban starts.
1167
1168 * Thuban/UI/about.py: New. New About box that displays
1169 library version information and credits.
1170
1171 * Thuban/version.py: Added new 'versions' dictionary which
1172 contains the verions of various libraries which are checked
1173 when the module loads.
1174 (verify_versions): Check all version numbers and returns
1175 a list of errors.
1176
1177 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
1178 Reset the status of the buttons as the situation warrants,
1179 but in a better more reliable way by not relying on the
1180 current status to determine what needs to change.
1181
1182 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
1183 (verify_versions): Remove most of the code since it is
1184 now in Thuban.version.verify_versions.o
1185
1186 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
1187 About box in Thuban.UI.about.
1188
1189 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
1190 Returns the version of gdal library being used as a string.
1191
1192 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1193 Removed.
1194 (get_proj_version): Return the version of PROJ that the file
1195 was compiled with.
1196 (get_gtk_version): Return th version of GTK that the file
1197 was compiled with.
1198
1199 2003-06-25 Jonathan Coles <[email protected]>
1200
1201 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
1202 of the SelectPropertiesDialog should be self so the window
1203 appears on top.
1204 (ClassGroupPropertiesCtrl.DoEdit): The parent
1205 of the SelectPropertiesDialog should be self so the window
1206 appears on top.
1207
1208 * Thuban/UI/resource.py: Cleaned up how we determine file
1209 extensions.
1210 (GetImageResource): Return an wxImage from our Resources.
1211
1212 2003-06-24 Jonathan Coles <[email protected]>
1213
1214 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1215 Check that a layer has a classification before trying
1216 to get it. Raster layers don't have classifications.
1217
1218 2003-06-23 Jonathan Coles <[email protected]>
1219
1220 * setup.py: Add Resources/XML to resource list.
1221
1222 2003-06-23 Jonathan Coles <[email protected]>
1223
1224 * setup.cfg: Fix copyright dates
1225
1226 2003-06-23 Jonathan Coles <[email protected]>
1227
1228 * MANIFEST.in: Update with Resources/XML
1229
1230 * setup.py: Don't include Locale resources yet as we don't
1231 have any and it causes problems building the distribution
1232 for Windows. Update version to 0.8.0.
1233
1234 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
1235
1236 * Thuban/UI/mainwindow.py: Add blank line at the end because
1237 file was not being read correctly building the Windows
1238 distribution.
1239
1240 2003-06-23 Jonathan Coles <[email protected]>
1241
1242 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
1243
1244 * Thuban/version.py: Temporarily update longversion for
1245 the 0.8 release so that it doesn't have the cvs revision.
1246
1247 2003-06-23 Jonathan Coles <[email protected]>
1248
1249 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
1250 to make sure that we don't create reentrant possibilities with
1251 wxYield.
1252
1253 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
1254 directly to avoid the wxSafeYield() call which generates an
1255 OnPaint event causing infinite recursion. Don't try to catch
1256 exception anymore. This was for before there were limits on map
1257 scaling.
1258
1259 2003-06-23 Bernhard Herzog <[email protected]>
1260
1261 Bug fix for RT #1961:
1262
1263 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
1264 Register DerivedShapestores with the session
1265
1266 * Thuban/Model/session.py (Session.Tables): Make sure each table
1267 is only listed once.
1268
1269 * test/test_load.py (TestJoinedTable.test): Add check_format call.
1270 Update file contents to match the one written out.
1271
1272 2003-06-20 Bernhard Herzog <[email protected]>
1273
1274 * test/xmlsupport.py (SaxEventLister.startElementNS)
1275 (SaxEventLister.endElementNS): Do not include the qname. Python
1276 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
1277 is (presumably incorrectly) None, whereas it's a string with the
1278 element name in the later versions.
1279
1280 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
1281 (TestEventList.test_even_list_namespace): Update tests to reflect
1282 the new behaviour
1283 (TestEventList.test_even_list_id_normalization): Fix doc-string
1284
1285 2003-06-20 Jonathan Coles <[email protected]>
1286
1287 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
1288 by deriving classes to determine if that layer supports shapes.
1289 (Layer): Override HasShapes and return true.
1290
1291 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
1292 instead of a direct call to wx[Begin|End]CusyCursor().
1293 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
1294 table data.
1295
1296 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
1297 New. Wrappers around the wxWindows functions that allow us to
1298 make additional calls such as wxYield which gives the native
1299 system a chance to update the cursor correctly.
1300
1301 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
1302 instead of a direct call to wx[Begin|End]CusyCursor().
1303
1304 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
1305 instead of a direct call to wx[Begin|End]CusyCursor().
1306 (MapCanvas.find_shape_at): Check if the current search layer
1307 support shapes, otherwise go on to the next layer.
1308
1309 * test/test_layer.py: Add tests in each type of layer for
1310 HasClassification() and HasShapes()
1311
1312 2003-06-20 Jonathan Coles <[email protected]>
1313
1314 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
1315 turning on the busy cursor to allow the system to change the
1316 cursor before we begin painting. This fixes a problem that
1317 was occuring only under GTK. Fixes RTbug #1840.
1318
1319 2003-06-20 Bernhard Herzog <[email protected]>
1320
1321 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
1322 version.
1323
1324 * Thuban/Model/save.py (sort_data_stores): New. Make topological
1325 sort of the data sources so they can be written with sources that
1326 data sources that depend on other data sources come after the
1327 sources they depend on.
1328 (SessionSaver.__init__): Add idmap instance variable to map from
1329 objects to the ids used in the file.
1330 (SessionSaver.get_id, SessionSaver.define_id)
1331 (SessionSaver.has_id): New. Methods to manage the idmap
1332 (SessionSaver.write): Use thuban-0.8.dtd
1333 (SessionSaver.write_session): Add a namespace on the session and
1334 write out the data sources before the maps.
1335 (SessionSaver.write_data_containers): New. Write the data
1336 containers.
1337 (SessionSaver.write_layer): Layer elements now refer to a
1338 shapestore and don't contain filenames anymore.
1339
1340 * Thuban/Model/load.py (LoadError): Exception class to raise when
1341 errors in the files are discovered
1342 (SessionLoader.__init__): Define dispatchers for elements with a
1343 thuban-0.8 namespace too.
1344 (SessionLoader.check_attrs): New helper method to check and
1345 convert attributes
1346 (AttrDesc): New. Helper class for SessionLoader.check_attrs
1347 (SessionLoader.start_fileshapesource)
1348 (SessionLoader.start_derivedshapesource)
1349 (SessionLoader.start_filetable, SessionLoader.start_jointable):
1350 Handlers for the new elements in the new fileformat
1351 (SessionLoader.start_layer): Handle the shapestore attribute in
1352 addition to filename.
1353 (SessionLoader.start_table, SessionLoader.end_table): Removed.
1354 They were never used in the old formats and aren't needed for the
1355 new.
1356
1357 * Thuban/Model/session.py (Session.DataContainers): New method to
1358 return all "data containers", i.e. shapestores and tables
1359
1360 * test/xmlsupport.py (SaxEventLister.__init__)
1361 (SaxEventLister.startElementNS, sax_eventlist): Add support to
1362 normalize IDs.
1363
1364 * test/test_xmlsupport.py
1365 (TestEventList.test_even_list_id_normalization): New test case for
1366 id normalization
1367
1368 * test/test_load.py (LoadSessionTest.check_format): Use ID
1369 normalization
1370 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
1371 class atrributes used for ID normalization
1372 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
1373 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
1374 file format
1375 (TestJoinedTable): New test for loading sessions with joined
1376 tables.
1377 (TestLoadError): New. Test whether missing required attributes
1378 cause a LoadError.
1379
1380 * test/test_save.py (SaveSessionTest.thubanids)
1381 (SaveSessionTest.thubanidrefs): New class attributes for ID
1382 normalization in .thuban files.
1383 (SaveSessionTest.compare_xml): Use id-normalization.
1384 (SaveSessionTest.testEmptySession)
1385 (SaveSessionTest.testLayerProjection)
1386 (SaveSessionTest.testRasterLayer)
1387 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
1388 (SaveSessionTest.testLayerProjection): The filename used was the
1389 same as for testSingleLayer. Use a different one.
1390 (SaveSessionTest.test_dbf_table)
1391 (SaveSessionTest.test_joined_table): New test cases for saving the
1392 new data sources structures.
1393 (TestStoreSort, MockDataStore): Classes to test the sorting of the
1394 data stores for writing.
1395
1396 * test/runtests.py: Add CVS keywords
1397
1398 2003-06-20 Jonathan Coles <[email protected]>
1399
1400 * test/test_session.py
1401 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
1402 Use the cultural_landmark-point.dbf file for the store so that
1403 the table rows and shape count match.
1404
1405 2003-06-20 Jonathan Coles <[email protected]>
1406
1407 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
1408 an exception if the number of shapes is different from the
1409 number of rows in the table. Address RTbug #1933.
1410
1411 * test/test_layer.py (TestLayer.test_derived_store): Add
1412 a test for the new exception in DerivedShapeStore.__init__.
1413
1414 * test/support.py (FloatTestCase): Removed since there is
1415 already FloatComparisonMixin. Fixes RTbug #1954.
1416 (FloatComparisonMixin.assertFloatEqual): Include test for
1417 infinity that was part of FloatTestCase.
1418
1419 * test/test_range.py (RangeTest): Inherit from
1420 support.FloatComparisonMixin now that we don't have
1421 support.FloatTestCase.
1422
1423 2003-06-20 Bernhard Herzog <[email protected]>
1424
1425 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
1426 the implementation in xmlsupport instead.
1427 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
1428
1429 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
1430 of test_save
1431
1432 2003-06-20 Bernhard Herzog <[email protected]>
1433
1434 * test/test_load.py (LoadSessionTest.check_format): New helper
1435 method to make sure the test files we load might have been written
1436 by the current thuban version.
1437 (ClassificationTest.TestLayers, TestSingleLayer.test)
1438 (TestLayerVisibility.test, TestClassification.test)
1439 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
1440 Add check_format() calls and fix the thuban data to match the data
1441 that would be written by saving the session loaded from it.
1442
1443 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
1444 the same class and function in test_save.
1445
1446 * test/test_xmlsupport.py (TestEventList): New. test cases for
1447 sax_eventlist
1448
1449 2003-06-20 Bernhard Herzog <[email protected]>
1450
1451 * Resources/XML/thuban.dtd: Add comment about which versions of
1452 Thuban are covered by this DTD
1453 (map): Fix content model for layers and raster layers. There can
1454 be any number or layers and raster layers in any order.
1455
1456 2003-06-20 Jonathan Coles <[email protected]>
1457
1458 This is mainly about fixing RTbug #1949.
1459
1460 * Thuban/Model/classification.py: Remove "from __future__"
1461 import statement since python 2.2 is the earliest supported
1462 version.
1463
1464 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
1465 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
1466 depending on the units this projection *forwards* into.
1467
1468 * Thuban/Model/save.py (SessionSaver.write_classification):
1469 Remove unnecessary use of lambdas and nested functions.
1470
1471 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
1472 adjustment here if the map projection uses degrees.
1473
1474 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
1475 scale adjust code since it is now done before calling
1476 this method. Don't do anything if the map projection
1477 is None.
1478
1479 2003-06-19 Bernhard Herzog <[email protected]>
1480
1481 Move version specific load tests to their own file.
1482
1483 * test/test_load.py: Expand the doc-string to explain a bit how to
1484 handle file format changes.
1485 (TestClassification.test): Update the docstring as this test is
1486 not about Thuban 0.2 anymore.
1487
1488 * test/test_load_0_2.py: New file with the load tests for thuban
1489 files created with Thuban 0.2 and earlier.
1490
1491 2003-06-19 Bernhard Herzog <[email protected]>
1492
1493 Add XML validation to some of the tests. Validation will only be
1494 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
1495 To make the DTD available to the test cases it's moved into
1496 Resources/XML
1497
1498 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
1499 for versions up to and including 0.2. Two slight changes: added an
1500 encoding specification and fixed the comment which refered to
1501 GRASS, not Thuban
1502
1503 * test/xmlsupport.py: New support module for tests involving XML.
1504 Currently there's a mix-in class for XML validation.
1505
1506 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
1507
1508 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
1509 so that we can validate the
1510 (SaveSessionTest.testEmptySession)
1511 (SaveSessionTest.testSingleLayer)
1512 (SaveSessionTest.testSingleLayer)
1513 (SaveSessionTest.testLayerProjection)
1514 (SaveSessionTest.testRasterLayer)
1515 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
1516
1517 * test/runtests.py (main): Call print_additional_summary instead
1518 of print_garbage_information
1519
1520 * test/support.py (resource_dir): New function to return the
1521 "Resource" subdirectory
1522 (print_additional_summary): New function to combine several
1523 summary functions
1524 (run_tests): Use print_additional_summary instead of calling
1525 print_garbage_information directly
1526
1527 2003-06-19 Bernhard Herzog <[email protected]>
1528
1529 * Doc/thuban.dtd (classification): Correct the content model of
1530 the classification element.
1531 (projection): Add the "name" attribute
1532
1533 2003-06-19 Frank Koormann <[email protected]>
1534
1535 MERGE from the greater-ms3 branch.
1536
1537 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
1538 scale if projection is latlong to get better estimate.
1539
1540 Fix problem of hidden properties dialog under windows after double
1541 click on layer tree:
1542 The tree control always gets an Expanded / Collapsed event after
1543 the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
1544 raises the already displayed window.
1545
1546 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
1547 raiseProperties initialized to prevent endless loops
1548 (LegendTree._OnItemActivated): Depending on self.raiseProperties
1549 simply raise the properties or open the dialog and issue a second
1550 event.
1551
1552 2003-06-18 Jonathan Coles <[email protected]>
1553
1554 * setup.py: Fix a few problems that occured under Windows.
1555
1556 2003-06-18 Jonathan Coles <[email protected]>
1557
1558 When Thuban loaded the map was redrawn twice because the
1559 legend was being opened after the mainwindow was created
1560 and not during its creation. This meant the map was drawn
1561 initially and then had to be redrawn when the legend
1562 caused the display to change. Now the legend is opened
1563 in the mainwindow constructor which resolves this issue.
1564
1565 Also, although we were checking for the existence of
1566 gdal and gdalwarp modules, the gdalwarp extension was
1567 still being compiled (which may fail if the system doesn't
1568 have gdal installed). the build_ext command to setup.py
1569 now accepts the flags --with-gdal and --without-gdal.
1570 If --without-gdal is specified setup.py will try to
1571 use the gdal parameters specified by gdal-config. Under
1572 windows, those parameters have to be set in setup.py
1573 as with proj4 an wxWindows.
1574
1575 * setup.py: Use a list instead of seperate variables for
1576 extension parameters so we can create a generic function
1577 that runs an appropriate *-config script.
1578 (run_cs_script): Renamed from run_wx_script and modified
1579 to accept a second argument which is a list of lists to
1580 be filled in by the values returned from running the command.
1581 (thuban_build_ext): New. Extends the build_ext command and
1582 provides the options --with-gdal/--without-gdal which then
1583 optionally includes the gdalwarp extension.
1584
1585 * Thuban/Model/resource.py: First check if we can import
1586 the gdalwarp Thuban extension before checking for gdal.
1587 Also added some comments.
1588
1589 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
1590 the map is None which may be the case if none has been loaded
1591 yet.
1592
1593 * Thuban/UI/main.py (main): Remove call to ShowLegend.
1594
1595 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
1596
1597 * Thuban/UI/renderer.py: Check for gdal support before importing
1598 gdalwarp.
1599 (MapRenderer.render_map): Only try to optimize if we have gdal
1600 support otherwise nothing will get drawn.
1601
1602 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
1603 during startup before a map has been created. Check if map is None
1604 before using it and do nothing if it is.
1605
1606 2003-06-17 Jonathan Coles <[email protected]>
1607
1608 Fix the problem with raster layers under Windows that caused
1609 Thuban to crash. The view should respond to layer projection
1610 changed events to update the display. Changes to a projection
1611 should not cause the map to be set to full extent.
1612
1613 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1614 current_map_proj to remember the current map projection so that
1615 when the projection changes we know what the previous projection
1616 was.
1617 (MapCanvas.SetMap): Unsubscribe and subscribe to
1618 LAYER_PROJECTION_CHANGED events.
1619 (MapCanvas.projection_changed): Split into two methods that respond
1620 to map and layer projection changes.
1621 (MapCanvas.map_projection_changed): New. Takes the current view and
1622 projects it using the new projection. This does not cause the
1623 map to be redrawn at full extent.
1624 (MapCanvas.layer_projection_changed): New. Cause a redraw which
1625 will draw each layer in its new projection.
1626
1627 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
1628 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
1629 under Windows.
1630
1631 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
1632 to twice sizeof(void*) because there are two digits for each
1633 hex byte.
1634
1635 2003-06-16 Bernhard Herzog <[email protected]>
1636
1637 Update to the layer interface: Direct access to the table,
1638 shapetable, shapefile and filename attributes is now actively
1639 deprecated by issuing deprecation warnings for all places where
1640 this happens.
1641
1642 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
1643 to the instance variables table, shapetable, shapefile and
1644 filename via __getattr__ so that we can issue a deprecation
1645 warning.
1646 (Layer.SetShapeStore): Don't set the deprecated instance variables
1647 any more
1648 (Layer.SetShapeStore): Don't use deprecated layer instance
1649 variables
1650 (Layer.Destroy): No need to explicitly remove the instance
1651 variables any more
1652 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
1653 instance variables
1654
1655 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1656 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
1657 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
1658 use deprecated layer instance variables
1659
1660 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
1661 deprecated layer instance variables
1662
1663 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1664 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
1665 instance variables
1666
1667 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
1668 deprecated layer instance variables
1669
1670 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
1671 deprecated layer instance variables
1672
1673 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
1674 deprecated layer instance variables
1675
1676 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
1677 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
1678 variables
1679
1680 * test/runtests.py (main): Turn Thuban's deprecation warnings into
1681 errors so that they're cought by the tests
1682
1683 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
1684 layer instance variables
1685
1686 2003-06-16 Jonathan Coles <[email protected]>
1687
1688 Fix a problem under Windows whereby if the user double-clicks on a
1689 layer in the legend that tree item will expand or collapse as well
1690 as open the layer properties dialog. The state of the tree item
1691 should not be affected.
1692
1693 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
1694 preventExpandCollapse and subscribe to expanding and collapsing
1695 events.
1696 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
1697 collapsing events and will veto the event if it has been triggered
1698 by the user double clicking on a layer.
1699 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
1700 that an expanding/collapsing event should be vetoed.
1701
1702 2003-06-13 Bernhard Herzog <[email protected]>
1703
1704 * Thuban/UI/classifier.py (Classifier.OnClose)
1705 (Classifier.map_layers_removed)
1706 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
1707 in OnClose and not in map_layers_removed or
1708 layer_shapestore_replaced to make sure it always happens when the
1709 dialog is closed
1710
1711 2003-06-13 Jonathan Coles <[email protected]>
1712
1713 This puts back a fix for Windows where a panel is needed so that
1714 the background of the table view appears correctly.
1715
1716 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
1717 object that can be used by derived classes to place any
1718 controls (including the grid) onto.
1719 (QueryTableFrame.__init__): Use the panel as the parent window
1720 for all the controls. Reparent the grid so that the panel is
1721 the parent. Call UpdateStatusText() to correctly initialize
1722 the status bar.
1723
1724 2003-06-13 Jonathan Coles <[email protected]>
1725
1726 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
1727 from wxFrame (as opposed to wxDialog like the other classes)
1728 but otherwise behaves like the other classes. This is needed
1729 for the TableView which isn't really a dialog and needs to
1730 have a status bar and control buttons.
1731
1732 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
1733 instance variable to keep track of how many rows are selected.
1734 Subscribe once to the the events we are interested in.
1735 (ThubanGrid.OnRangeSelect): Only handle event if event handling
1736 hasn't been turned off.
1737 (ThubanGrid.OnSelectCell): Only handle event if event handling
1738 hasn't been turned off.
1739 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
1740 as an event listener (which changes the event handler stack)
1741 simply set an instance variable to False. This is checked in
1742 the event handlers.
1743 (ThubanGrid.GetNumberSelected): Return the number of currently
1744 selected rows.
1745 (TableFrame): Inherit from ThubanFrame so we can have a
1746 status bar and control buttons.
1747 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
1748 Explicitly set which items are selected in the operator choice and
1749 action choice so there is always a valid selection. Fixes RTbug #1941.
1750 Subscribe to grid cell selection events so we can update the
1751 status bar.
1752 (QueryTableFrame.UpdateStatusText): Update the status bar with
1753 how many rows are in the grid, how many columns, and how many
1754 rows are selected.
1755 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
1756 Call UpdateStatusText when cells are (de)selected.
1757 (QueryTableFrame.OnQuery): Use the string value in the value
1758 combo if either the selected item index is 0 or if the string
1759 cannot be found in the predefined list (this happens if the
1760 user changes the text). Fixes RTbug #1940.
1761 Only turn off the grid event listeners if there a query comes
1762 back with a none empty list of ids. in the case that the list
1763 is empty this causes a grid.ClearSelection() call to actually
1764 clear the grid selection which causes the selected items in
1765 the map to be deselected. Fixes RTbug #1939.
1766
1767 * test/test_save.py (XMLWriterTest.Encode): Check return values.
1768 Fixes RTbug #1851.
1769
1770 2003-06-13 Bernhard Herzog <[email protected]>
1771
1772 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
1773 self.selected_shape with the current selection to make sure the
1774 contents of the dialog are up to date when it's shown for the
1775 first time.
1776 The dialog used to work without this by luck. The recent fix to
1777 the connector module 'broke' a 'feature' the identify view was
1778 relying on, i.e that subscribing to a message in response to
1779 receiving a message of that type would mean that the new
1780 subscriber would also be called for the same message.
1781
1782 2003-06-12 Jonathan Coles <[email protected]>
1783
1784 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
1785 the image is rendered. Fixes RTbug #1937.
1786
1787 2003-06-12 Jonathan Coles <[email protected]>
1788
1789 * Thuban/Lib/fileutil.py: As is done under Windows, create the
1790 user directory if it doesn't exist on a posix system.
1791 Fixes RTbug #1815.
1792
1793 * Thuban/Model/resource.py (get_user_proj_files): Moved the
1794 called to get_application_dir here, so that the directory
1795 will only be called if this method is invoked.
1796
1797 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
1798 the projfilepath if no projection is selected.
1799
1800 2003-06-12 Jonathan Coles <[email protected]>
1801
1802 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
1803 the scalebar if the current map has no projection set.
1804
1805 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
1806 projfilepath label to just the basename of the projection file
1807 rather than include the entire path.
1808
1809 * Thuban/Model/resource.py: Fix missed proj functions that
1810 needed to be renamed.
1811
1812 2003-06-12 Jonathan Coles <[email protected]>
1813
1814 * Thuban/Model/classification.py: Removed assert statements that
1815 tested if the variable was an instance of Color.
1816
1817 * Thuban/Model/color.py (Color): Remove commented code that isn't
1818 used.
1819 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
1820 Fixes RTbug #1835.
1821 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
1822 Needed now that the class doesn't inherit from Color.
1823
1824 2003-06-12 Jonathan Coles <[email protected]>
1825
1826 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
1827 check unicode strings.
1828
1829 * test/test_layer.py: Check for existence of gdal.
1830
1831 2003-06-12 Jonathan Coles <[email protected]>
1832
1833 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
1834 that was in load.py
1835
1836 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
1837 that was in save.py
1838
1839 2003-06-12 Jonathan Coles <[email protected]>
1840
1841 This is largely a collection of bug fixes. We also handle the
1842 case where gdal is not on the system. The XMLReader and XMLWriter
1843 classes were moved into there own files to resolve some circular
1844 import references and because they shouldn't really be in the
1845 file that is dediciated to reading/writing session files since
1846 they are also used elsewhere.
1847
1848 * Thuban/Model/classgen.py: Renamed functions to follow the
1849 function_names_with_underscores style. Fixes RTbug #1903.
1850 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
1851
1852 * Thuban/Model/layer.py: Import gdal only if it available.
1853 (RasterLayer): Handle the case where the gdal library is unavailable.
1854 Addresses RTbug #1877.
1855
1856 * Thuban/Model/load.py (XMLReader): Moved into seperate file
1857 xmlreader.py.
1858
1859 2003-06-12 Jonathan Coles <[email protected]>
1860
1861 This is largely a collection of bug fixes. We also handle the
1862 case where gdal is not on the system. The XMLReader and XMLWriter
1863 classes were moved into there own files to resolve some circular
1864 import references and because they shouldn't really be in the
1865 file that is dediciated to reading/writing session files since
1866 they are also used elsewhere.
1867
1868 * Thuban/Model/classgen.py: Renamed functions to follow the
1869 function_names_with_underscores style. Fixes RTbug #1903.
1870 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
1871
1872 * Thuban/Model/layer.py: Import gdal only if it available.
1873 (RasterLayer): Handle the case where the gdal library is unavailable.
1874 Addresses RTbug #1877.
1875
1876 * Thuban/Model/load.py (XMLReader): Moved into seperate file
1877 xmlreader.py.
1878
1879 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
1880 file xmlwriter.py.
1881
1882 * Thuban/Model/resource.py: Renamed functions to following the
1883 function_names_with_underscores style.
1884 (has_gdal_support): New function that returns true if the gdal
1885 library is available. Addresses RTbug #1877.
1886
1887 * Thuban/UI/application.py (ThubanApplication.OpenSession):
1888 Display a message box if the gdal library is not available, but
1889 only if there are any layers that would use it. Addresses RTbug #1877.
1890
1891 * Thuban/UI/classgen.py: Use renamed projection resource functions.
1892 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
1893 when using integers versus floats.
1894
1895 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
1896 determine if the "Add Image Layer" menu option should be
1897 greyed out or not. Addresses RTbug #1877.
1898
1899 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
1900
1901 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
1902 optimize if a raster layer is visible. Fixes RTbug #1931.
1903 Only draw the raster layer if the gdal library is available.
1904 Addresses RTbug #1877.
1905
1906 * test/test_classgen.py: Add tests for generate_singletons,
1907 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
1908 (test_calculate_quantiles): Fix some tests to catch the new
1909 ValueError that is raised.
1910
1911 * test/test_proj.py: Use renamed projection resource functions.
1912
1913 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
1914 test for saving classified layers. Fixes RTbug #1902.
1915 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
1916
1917 2003-06-12 Jan-Oliver Wagner <[email protected]>
1918
1919 Fix for http://intevation.de/rt/webrt?serial_num=1900.
1920
1921 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
1922
1923 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
1924 multiplechoicedialog.py rather than from the wxPython library.
1925
1926 2003-06-11 Frank Koormann <[email protected]>
1927
1928 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
1929 update.
1930
1931 2003-06-11 Frank Koormann <[email protected]>
1932
1933 * Thuban/Lib/fileutil.py (get_application_dir): New function to
1934 determine the absolute .thuban/thuban directory under
1935 "posix" (os.expanduser) and "nt" (read AppData registry key).
1936
1937 * Thuban/Model/resource.py: Use get_application_dir
1938
1939 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1940 Use get_application_dir.
1941
1942 2003-06-10 Bernhard Herzog <[email protected]>
1943
1944 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
1945 the messages MAP_LAYERS_REMOVED messages
1946 (LayerTableFrame.OnClose): Unsubscribe from it.
1947 (LayerTableFrame.map_layers_removed): New. Receiver for
1948 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
1949 dialog is showing is removed.
1950
1951 2003-06-10 Bernhard Herzog <[email protected]>
1952
1953 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
1954 of the receivers list so that unsubscribing in a receiver doesn't
1955 modify it while iterating over it.
1956
1957 * test/test_connector.py
1958 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
1959 unsubscribing in a receiver works correctly. See docstring for
1960 details
1961
1962 2003-06-10 Bernhard Herzog <[email protected]>
1963
1964 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
1965 message.
1966
1967 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
1968 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
1969 LAYER_CHANGED will still be sent if the classification changes.
1970
1971 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
1972 parameter so we can subscribe to some of its messages
1973 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
1974 and the layer's LAYER_SHAPESTORE_REPLACED
1975 (Classifier.unsubscribe_messages): New. Unsubscribe from message
1976 subscribed to in __init__
1977 (Classifier.map_layers_removed)
1978 (Classifier.layer_shapestore_replaced): receivers for the messages
1979 subscribed to in __init__. Unsubscribe and close the dialog
1980
1981 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
1982 the map to the Classifier dialog
1983
1984 * test/test_layer.py (SetShapeStoreTests): Derive from
1985 SubscriberMixin as well so we can test messages
1986 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
1987 messages
1988 (SetShapeStoreTests.tearDown): Clear the messages again
1989 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
1990 for the modified flag too
1991 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
1992 to check whether SetShapeStore sets the modified flag
1993 (SetShapeStoreTests.test_set_shape_store_different_field_name)
1994 (SetShapeStoreTests.test_set_shape_store_same_field)
1995 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
1996 Add tests for the messages. This checks both the new
1997 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
1998
1999 2003-06-06 Jan-Oliver Wagner <[email protected]>
2000
2001 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
2002 the menu items.
2003
2004 2003-06-05 Frank Koormann <[email protected]>
2005
2006 * Thuban/UI/identifyview.py (IdentifyView.__init__):
2007 Layout reimplemented without panel. Make life easier to fit the list
2008 in the dialog.
2009
2010 2003-06-05 Frank Koormann <[email protected]>
2011
2012 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
2013 once on initialisation (Former implementation resulted in multiple
2014 entries for each projection).
2015 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
2016 if set, select the projection found under the specified name. This
2017 overwrites any other selection estimate.
2018 Removed projchoice filling from this method.
2019 (ProjFrame._OnSave, ProjFrame._OnAddToList):
2020 Updated call of ProjFrame.__FillAvailList
2021 (LCCPanel._DoLayout): Moved parameter controls in more common order.
2022
2023 * Resources/Projections/defaults.proj: Extended defaults representing
2024 various common European projections.
2025
2026 2003-06-05 Frank Koormann <[email protected]>
2027
2028 * Thuban/UI/identifyview.py (IdentifyView.__init__):
2029 Use ListCtrl instead of GridCtrl
2030
2031 * Thuban/Model/resource.py:
2032 Guess location of .thuban directory from tempdir parent directory.
2033
2034 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2035 Guess location of .thuban directory from tempdir parent directory.
2036
2037 2003-06-04 Bernhard Herzog <[email protected]>
2038
2039 Do not cache the values returned by the tree widget's
2040 GetFirstChild and GetNextChild methods because it led to lots of
2041 segfaults. The new way requires more brute force but is more
2042 reliable.
2043
2044 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
2045 variable layer2id
2046 (LegendTree.find_layer): New method to do with brute force what
2047 layer2id tried to accomplish
2048 (LegendTree._OnMsgLayerChanged)
2049 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
2050 Use find_layer instead of layer2id
2051 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
2052 update layer2id anymore
2053 (LegendTree._OnMsgMapLayersRemoved)
2054 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
2055
2056 2003-06-03 Thomas Koester <[email protected]>
2057
2058 * Thuban/Model/classgen.py (GenQuantiles0): New function.
2059
2060 2003-06-02 Bernhard Herzog <[email protected]>
2061
2062 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
2063 New commands.
2064 (main_menu): Add the new commands.
2065 (MainWindow.TableRename): New. Implementation of the table_rename
2066 command.
2067 (MainWindow.RenameLayer): New. Implementation of the layer_rename
2068 command.
2069
2070 * Thuban/Model/session.py (Session.AddTable): call self.changed to
2071 set the modified flag
2072
2073 * test/test_session.py (TestSessionSimple.test_add_table): Test
2074 whether the modified flag is set properly
2075
2076 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
2077 instead of issue so that the modified flags get updated.
2078
2079 * test/test_base.py (SomeTitledObject): Derive from Modifiable
2080 instead of Publisher to reflect reality better and to accomodate
2081 the fact that SetTitle now calls changed instead of issue
2082
2083 2003-06-02 Bernhard Herzog <[email protected]>
2084
2085 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
2086 acquisition has to happen before the try in a try-finally.
2087
2088 2003-06-02 Bernhard Herzog <[email protected]>
2089
2090 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
2091 possible that a layer is removed that is not currently selected in
2092 the legend so don't check for this.
2093
2094 2003-05-30 Bernhard Herzog <[email protected]>
2095
2096 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
2097 variables to None that have direct or indirect references to
2098 shapefiles or dbf files to make sure that they do go away and the
2099 files are closed.
2100
2101 2003-05-30 Bernhard Herzog <[email protected]>
2102
2103 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
2104 availImgListIndices when a new image list is created
2105
2106 2003-05-30 Bernhard Herzog <[email protected]>
2107
2108 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
2109 changing_selection to indicate whether the LegendTree code itself
2110 is currently changing the selection
2111 (LegendTree.normalize_selection): New method to normalize the
2112 selection by selecting the layer item even if the user clicked on
2113 the classification.
2114 (LegendTree._OnSelChanged): normalize the selection. This works
2115 around a bug in wx which doesn't keep track of the selection
2116 properly when subtrees are deleted.
2117
2118 2003-05-30 Bernhard Herzog <[email protected]>
2119
2120 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
2121 maximum and minimum scale factors.
2122
2123 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
2124 changes in classgen.py
2125
2126 2003-05-30 Jonathan Coles <[email protected]>
2127
2128 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
2129 all the methods functions. Fixes RTBug #1903.
2130
2131 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
2132 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
2133 RTBug #1907.
2134
2135 * Thuban/UI/classgen.py: Use classgen functions that were part
2136 of the ClassGenerator class. Put try/finally blocks around
2137 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
2138 RTBug #1904.
2139
2140 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
2141
2142 * Thuban/UI/legend.py: The legend was cleared and repopulated any
2143 time something changed which caused some state to be lost such
2144 as which children were expanded or collapsed. Fixes RTBug #1901.
2145 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
2146 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
2147 the legend but not in the map.
2148 (LegendTree.__FillTree): Move main functionality out into smaller
2149 methods that can be used by other methods.
2150 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
2151 if they are available.
2152 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
2153 that we override the wxTreeCtrl method. Iterate over children
2154 and call __RemoveLayer.
2155 (LegendTree.__AddLayer): New. Add a new layer to the legend.
2156 (LegendTree.__RemoveLayer): Remove a layer from the legend.
2157 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
2158 Should only be called with the id of a layer branch.
2159 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
2160 Returns the root item or creates one if necessary.
2161
2162 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
2163 ProjectRasterFile with tuple arguments instead of strings.
2164
2165 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
2166 with try/finally. Fixes RTBug #1904.
2167
2168 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
2169 with try/finally. Fixes RTBug #1904.
2170 (MapCanvas.FitSelectedToWindow): If a single point is selected
2171 simply center it on the display. Fixes RTBug #1849.
2172
2173 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
2174 to be compiled as a standalone app. Now the code can only be
2175 called from Python which simplifies the parameter passing.
2176 (ProjectRasterFile): Handle Python arguments. Remove code that
2177 checks for a destination dataset. Add more clean up code.
2178
2179 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
2180 TestMapWithContents.test_lower_layer_bottom):
2181 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
2182 Fixes RTBug #1907.
2183
2184 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
2185 extent to the map when the legend is toggled. Fixes RTBug #1881.
2186
2187 2003-05-29 Jan-Oliver Wagner <[email protected]>
2188
2189 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
2190 unsubscribes all that is subcribed in __init__.
2191
2192 2003-05-28 Bernhard Herzog <[email protected]>
2193
2194 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
2195 (MainWindow.CanDuplicateLayer): New methods to implement the
2196 Layer/Duplicate command.
2197 (layer_duplicate command): New.
2198 (main_menu): Add layer_duplicate to the Layer menu.
2199
2200 2003-05-28 Bernhard Herzog <[email protected]>
2201
2202 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
2203 renderer so that NULL/None values get displayed differently (by a
2204 gray rectangle).
2205 (TableGrid.__init__): Override the default renderers
2206
2207 2003-05-28 Bernhard Herzog <[email protected]>
2208
2209 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
2210 classification to "None" if the type of the field has changed.
2211
2212 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
2213 test for the Layer.SetShapeStore method
2214
2215 2003-05-28 Jan-Oliver Wagner <[email protected]>
2216
2217 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
2218 does not necessarily have a filename).
2219
2220 2003-05-28 Jan-Oliver Wagner <[email protected]>
2221
2222 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
2223 sort the selection list for the dialog.
2224
2225 2003-05-28 Frank Koormann <[email protected]>
2226
2227 * extensions/thuban/wxproj.cpp
2228 (project_point): Removed cast to int for projected point coordinates.
2229 (shape_centroid): Return last point if all polygon vertices fall
2230 to one point.
2231
2232 2003-05-28 Bernhard Herzog <[email protected]>
2233
2234 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
2235 with layers that don't have shapestores, i.e. raster layers.
2236
2237 2003-05-28 Bernhard Herzog <[email protected]>
2238
2239 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
2240 when determining the title from the filename.
2241
2242 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
2243 reflect changes in the way the title is derived from the filename
2244
2245 2003-05-28 Frank Koormann <[email protected]>
2246
2247 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
2248 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
2249
2250 2003-05-27 Bernhard Herzog <[email protected]>
2251
2252 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
2253 delegate SelectedLayer.
2254 (MainWindow.LayerUnjoinTable): Implement.
2255 (_can_unjoin): New. Helper function for the sensitivity of the
2256 layer/unjoin command.
2257
2258 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
2259 (DerivedShapeStore.OrigShapeStore): New. Return the original
2260 shapestore. Used to figure out how to unjoin.
2261 (DerivedShapeStore.Shapefile): Fix a typo.
2262
2263 2003-05-27 Bernhard Herzog <[email protected]>
2264
2265 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
2266 well
2267 (JoinDialog.__init__): Use the layer parameter and only build the
2268 left choice when a layer is given
2269 (JoinDialog.OnJoin): Handle layer joins as well
2270 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
2271 that the user selects the "Select..." item. The sensitivitly
2272 updating is now in update_sensitivity
2273 (JoinDialog.y): New method to refactor the sensitivity update of
2274 the join button into its own method.
2275
2276 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
2277
2278 2003-05-27 Bernhard Herzog <[email protected]>
2279
2280 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
2281 iff there are unreferenced tables in the session
2282
2283 2003-05-27 Bernhard Herzog <[email protected]>
2284
2285 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
2286
2287 * Thuban/Model/session.py (Session.UnreferencedTables): New method
2288 to return tables that are not referenced by other tables or shape
2289 stores and can be removed.
2290 (Session.RemoveTable): Issue a TABLE_REMOVED message after
2291 removing the table
2292
2293 * Thuban/UI/mainwindow.py: Remove unused imports
2294 (MainWindow.TableClose): Implement.
2295
2296 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
2297 messages so that the frame will be automatically closed when a new
2298 session is opened or the table is removed.
2299 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
2300 __init__
2301 (TableFrame.close_on_session_replaced)
2302 (TableFrame.close_on_table_removed): New. Subscribers that close
2303 the window
2304
2305 * test/test_session.py (TestSessionMessages.test_remove_table)
2306 (TestSessionSimple.test_remove_table): Move the test to
2307 TestSessionSimple and add test for the TABLE_REMOVED message
2308 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
2309 (TestSessionSimple.test_unreferenced_tables) New. Test for the
2310 UnreferencedTables method.
2311 (UnreferencedTablesTests): New. Class with some more sophisticated
2312 tests for UnreferencedTables.
2313
2314 2003-05-27 Frank Koormann <[email protected]>
2315
2316 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
2317 display has some unwanted side effects. Removed again.
2318
2319 2003-05-27 Frank Koormann <[email protected]>
2320
2321 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
2322
2323 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
2324
2325 2003-05-27 Jan-Oliver Wagner <[email protected]>
2326
2327 * test/test_menu.py (MenuTest.test): Added test for
2328 Menu.RemoveItem().
2329
2330 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
2331 the menu.
2332
2333 2003-05-27 Frank Koormann <[email protected]>
2334
2335 Nonmodal dialogs without parent (i.e. they can fall behind the main
2336 window)
2337
2338 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
2339 all dialogs in the dialogs dictionary and the canvas.
2340
2341 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
2342 parent, i.e. can fall behind other windows.
2343 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
2344 dictionary before removing it.
2345
2346 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
2347
2348 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
2349 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
2350 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
2351
2352 2003-05-27 Bernhard Herzog <[email protected]>
2353
2354 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
2355 tableview dialog
2356 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
2357 Also, don't use the table's titles as the dialog names. The titles
2358 aren't guaranteed to be unique.
2359 (MainWindow.TableOpen): Open a table view dialog after opening the
2360 table
2361
2362 2003-05-27 Bernhard Herzog <[email protected]>
2363
2364 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
2365 effect can be achieved by simply closing the window showing the
2366 table.
2367 (MainWindow.TableHide): Removed.
2368 (main_menu): Removed "table_hide"
2369
2370 2003-05-27 Frank Koormann <[email protected]>
2371
2372 Fix legend tree display problems under Win32
2373
2374 * Thuban/UI/legend.py: BMP_SIZE_W = 15
2375 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
2376 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
2377
2378 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
2379
2380 2003-05-27 Jan-Oliver Wagner <[email protected]>
2381
2382 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
2383 'after' now allows to insert separators almost anywhere in the menu.
2384
2385 2003-05-27 Frank Koormann <[email protected]>
2386
2387 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
2388 "S" of selection box label to hint on hot key (Alt-S). Works under
2389 Win32 but is ignored under GTK.
2390
2391 2003-05-26 Frank Koormann <[email protected]>
2392
2393 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
2394 Center Choices.
2395
2396 2003-05-26 Bernhard Herzog <[email protected]>
2397
2398 Remove the Precision methods again. They're too DBF specific to be
2399 part of the table interface and they're only used in table_to_dbf
2400 anyway.
2401
2402 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
2403 fixed precision of 12 for doubles.
2404 (TransientTableBase.Precision): Removed
2405 (AutoTransientTable.Width): Delegate to self.table.
2406
2407 * Thuban/Model/table.py (DBFTable.Precision)
2408 (MemoryTable.Precision): Removed.
2409 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
2410 (table_to_dbf): Use a fixed precision of 12 for floats unless the
2411 column object specifies something else.
2412
2413 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
2414 test for table_to_dbf
2415
2416 2003-05-26 Bernhard Herzog <[email protected]>
2417
2418 * test/test_transientdb.py
2419 (TestTransientTable.run_iceland_political_tests): Fix a comment.
2420
2421 2003-05-26 Bernhard Herzog <[email protected]>
2422
2423 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
2424 implementation. Mark parts of the file format strings for
2425 localization.
2426
2427 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
2428 file and add the table to the tables managed by the session
2429
2430 * test/test_session.py (TestSessionSimple.test_open_table_file):
2431 New. test case for OpenTableFile
2432
2433 2003-05-26 Jan-Oliver Wagner <[email protected]>
2434
2435 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
2436 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
2437 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
2438 Replace the true/false of wxWindows by True/False of Python 2.2.1.
2439
2440 2003-05-26 Jan-Oliver Wagner <[email protected]>
2441
2442 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
2443 already a selection present, update the grid accordingly.
2444
2445 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
2446 resizeable and increase its initial size.
2447
2448 2003-05-26 Frank Koormann <[email protected]>
2449
2450 Table export functionality
2451
2452 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
2453 Return width (in characters) for a column.
2454 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
2455 (table_to_dbf): Write table to dbf file.
2456 (table_to_csv): Write table to csv file.
2457
2458 * Thuban/Model/transientdb.py (TransientTableBase.Width,
2459 TransientTableBase.Precision): Return column width and precision.
2460
2461 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
2462 or table_to_csv depending on file selection.
2463
2464 * test/test_dbf_table.py:
2465 Test table_to_dbf (extension of former part of test).
2466
2467 * test/test_csv_table.py:
2468 Test table_to_csv.
2469
2470 2003-05-23 Jan-Oliver Wagner <[email protected]>
2471
2472 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
2473 Use QueryTableFrame instead of TableFrame.
2474
2475 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
2476 table window with 'Layer Table:' instead of 'Table:'.
2477
2478 2003-05-23 Jan-Oliver Wagner <[email protected]>
2479
2480 Give all tables a title via mix-in TitledObject.LayerShowTable
2481
2482 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
2483 only if it exists.
2484
2485 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
2486 and call its init-method with a default title. Remove Title() method.
2487
2488 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
2489 AutoTransientTable): mix-in TitledObject and call its init-method with
2490 a default title. Remove Title() method.
2491
2492 2003-05-23 Bernhard Herzog <[email protected]>
2493
2494 * Thuban/Model/session.py (Session.AddShapeStore): Define
2495 AddShapeStore analogously to AddTable.
2496
2497 * test/test_session.py (TestSessionSimple.test_add_shapestore):
2498 New. Test for AddShapeStore
2499
2500 2003-05-23 Jan-Oliver Wagner <[email protected]>
2501
2502 Introducing QueryTableFrame and a very coarse ShowTable implementation.
2503
2504 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
2505 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
2506 The latter implements the selection GUI without dependency on a layer.
2507 LayerTableFrame now is derived from QueryTableFrame and connects
2508 to a layer.
2509
2510 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
2511 implementation that still needs work.
2512
2513 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
2514
2515 2003-05-22 Frank Koormann <[email protected]>
2516
2517 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2518 Added "outer_join = False" as optional parameter.
2519 (TransientJoinedTable.create): If outer join is true, perform a
2520 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
2521 the left table. Records not matching are filled with 0 / None.
2522
2523 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
2524 (JoinDialog.OnJoin): Consider outer join check box.
2525
2526 2003-05-22 Bernhard Herzog <[email protected]>
2527
2528 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
2529 somewhat safer way. Storing the traceback in a local variable can
2530 lead to memory leaks
2531
2532 2003-05-22 Bernhard Herzog <[email protected]>
2533
2534 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
2535 the wxMessageDialog's Destroy() method.
2536
2537 2003-05-22 Frank Koormann <[email protected]>
2538
2539 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
2540 TransientTable.Title()
2541
2542 2003-05-22 Frank Koormann <[email protected]>
2543
2544 Join Dialog, initial version.
2545
2546 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
2547
2548 * Thuban/UI/join.py (JoinDialog): Functional implementation of
2549 former framework. Renamed Table1/Table2 to LeftTable/RightTable
2550 in all occurences.
2551
2552 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
2553 Typo fixed.
2554
2555 2003-05-22 Bernhard Herzog <[email protected]>
2556
2557 Give the tables titles so that the GUI can display more meaningful
2558 names. For now the titles are fixed but depend on e.g. filenames
2559 or the titles of the joined tables.
2560
2561 * Thuban/Model/transientdb.py (TransientTable.Title)
2562 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
2563
2564 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
2565
2566 * test/test_transientdb.py
2567 (TestTransientTable.test_auto_transient_table_title): New. Test
2568 for the Title method
2569 (TestTransientTable.test_transient_joined_table)
2570 (TestTransientTable.test_transient_table): Add test for the Title
2571 methods
2572
2573 * test/test_memory_table.py (TestMemoryTable.test_title): New.
2574 Test for the Title method
2575
2576 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
2577 the Title method
2578
2579 2003-05-22 Bernhard Herzog <[email protected]>
2580
2581 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2582 Provide a better way to destroy the layers
2583 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
2584 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2585 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
2586 the new way to destroy the layers.
2587 (TestLayer.test_derived_store): New. Test for using a layer with a
2588 DerivedShapeStore
2589
2590 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
2591 filename if the shape store actually has one.
2592
2593 2003-05-22 Bernhard Herzog <[email protected]>
2594
2595 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
2596 for the filename
2597
2598 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
2599 for the FileName method
2600 (TestDBFTableWriting.test_write): Fix spelling of filename
2601
2602 2003-05-22 Thomas Koester <[email protected]>
2603
2604 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
2605 from SciParam that now really is immutable.
2606
2607 2003-05-22 Frank Koormann <[email protected]>
2608
2609 Layer Top/Bottom placement added to legend.
2610
2611 * Thuban/UI/legend.py
2612 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
2613 bound to tool events.
2614 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
2615 New, methods binding the event methods with the map methods.
2616
2617 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
2618 layer at top/bottom of layer stack.
2619
2620 * Resources/Bitmaps/top_layer.xpm: New button icon.
2621
2622 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
2623
2624 2003-05-22 Bernhard Herzog <[email protected]>
2625
2626 * Thuban/Model/session.py (Session.RemoveTable): New method to
2627 remove tables
2628
2629 * test/test_session.py (TestSessionSimple.test_remove_table): New.
2630 Test for RemoveTable
2631
2632 2003-05-22 Thomas Koester <[email protected]>
2633
2634 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
2635 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
2636
2637 2003-05-22 Bernhard Herzog <[email protected]>
2638
2639 Implement a way to discover dependencies between tables and
2640 shapestores.
2641
2642 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
2643 (TransientJoinedTable.Dependencies)
2644 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
2645 interface
2646 (TransientJoinedTable.__init__): Keep tack of the original table
2647 objects in addition to the corresponding transient tables.
2648
2649 * Thuban/Model/table.py (DBFTable.Dependencies)
2650 (MemoryTable.Dependencies): New. Implement the dependencies
2651 interface
2652
2653 * Thuban/Model/data.py (ShapeTable): New. Helper class for
2654 ShapefileStore
2655 (ShapefileStore.__init__): Use ShapeTable instead of
2656 AutoTransientTable
2657 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
2658 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
2659 methods for filename and type
2660 (ShapefileStore.Dependencies): New. Implement the dependencies
2661 interface
2662 (DerivedShapeStore): New class to replace SimpleStore. The main
2663 difference to SimpleStore is that it depends not on a shapefile
2664 but another shapestore which expresses the dependencies a bit
2665 better
2666 (SimpleStore.__init__): Add deprecation warning.
2667
2668 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
2669 Test for the Dependencies method.
2670
2671 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
2672 New. Test for the Dependencies method.
2673
2674 * test/test_transientdb.py
2675 (TestTransientTable.test_auto_transient_table_dependencies): New.
2676 Test for the Dependencies method.
2677 (TestTransientTable.test_transient_joined_table): Add test for the
2678 Dependencies method.
2679
2680 * test/test_session.py (TestSessionSimple.setUp)
2681 (TestSessionSimple.tearDown): New. Implement a better way to
2682 destroy the sessions.
2683 (TestSessionSimple.test_initial_state)
2684 (TestSessionSimple.test_add_table): Bind session to self.session
2685 so that it's destroyed by tearDown
2686 (TestSessionSimple.test_open_shapefile): New. Test for
2687 OpenShapefile and the object it returns
2688
2689 2003-05-22 Bernhard Herzog <[email protected]>
2690
2691 * Thuban/Model/session.py (Session.AddTable): New method to
2692 register tables with the session.
2693 (Session.Tables): Return the tables registered with AddTable too.
2694
2695 * test/test_session.py (TestSessionSimple.test_add_table): New.
2696 Test case for the AddTable method
2697
2698 2003-05-22 Frank Koormann <[email protected]>
2699
2700 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
2701 lower right corner, center labels for selections, initialize controls
2702 in reasonable order for keyboard navigation.
2703
2704 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
2705 (ProjFrame.__DoOnProjAvail): Determine position of current projection
2706 using the wxListBox.FindString() method. Still a problem (#1886)
2707
2708 * Thuban/UI/classifier.py
2709 (Classifier.__init__, SelectPropertiesDialog.__init__)
2710
2711 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
2712 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
2713 different classification types from here to __init__.
2714 (GenUniquePanel.__init__): Set the column width of the first field
2715 in the Field ListCtrl to the full width.
2716
2717 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
2718 Button to 'Export'. Center Buttons in Selection Box, set Focus to
2719 Grid.
2720 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
2721 changes focus to the Selection when pressing "Alt-S".
2722
2723 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
2724 the text if not visible. The italic font sometimes exceeds the
2725 rendering area.
2726
2727 2003-05-21 Jonathan Coles <[email protected]>
2728
2729 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
2730 to OnClose so that Thuban closes correctly.
2731
2732 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
2733 DockFrame.OnClose, not DockFrame._OnClose.
2734
2735 2003-05-21 Jonathan Coles <[email protected]>
2736
2737 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
2738 references to 'inf' and use new Range __init__ to pass floats
2739 directly rather than converting them to strings first.
2740 Fixes RTBug #1876.
2741
2742 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
2743 Use new Range ___init__ to pass floats.
2744
2745 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
2746 filename is a valid image file. Throw IOError otherwise.
2747
2748 * Thuban/Model/range.py: Brought over new Range from SciParam that
2749 is immutable and has an __init__ which can accept floats.
2750
2751 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
2752 into try block. AddLayer doesn't throw any exceptions anymore.
2753 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
2754 try block.
2755
2756 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
2757 the first item in choices. Fixes RTBug #1882.
2758
2759 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
2760 has gone to 0 which is a serious problem. abort.
2761 (MapRenderer.draw_raster_layer): Catch IOError seperately and
2762 print the error from GDAL.
2763
2764 * Thuban/UI/tableview.py (TableGrid.__init__): Call
2765 ToggleEventListeners to turn on listening.
2766 (TableGrid.ToggleEventListeners): New. Turns event listening on
2767 and off so as to prevent excessive messages.
2768 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
2769 to suppress excessive messages when selecting many rows.
2770 Fixes RTBug #1880.
2771
2772 * Thuban/UI/view.py: Added checks against if scale == 0. This
2773 is a serious problem that can occur when an image without
2774 geo data is loading and causes the map projection bounds to
2775 go to infinity. Right now, the solution is to simply try
2776 to recover.
2777
2778 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
2779 to set the MFILEReceiver attributes even if the data is NULL.
2780
2781 * extensions/thuban/gdalwarp.cpp: Improved the error handling
2782 and passed GDAL messages back up to the Python layer. Also
2783 tried to fix some memory leaks that were present in the original
2784 utility but didn't matter because the program aborted.
2785
2786 * test/test_range.py: Copied over tests from SciParam. Removed
2787 tests against importing. Fixes RTBug #1867.
2788
2789 2003-05-21 Bernhard Herzog <[email protected]>
2790
2791 * test/test_load.py: Remove unused imports and restructure the
2792 test code
2793 (LoadSessionTest): Split into one class for each test and turn
2794 LoadSessionTest itself into the base class for all such session
2795 tests.
2796 (ClassificationTest): New base class for load tests that test
2797 classifications
2798 (TestSingleLayer, TestLayerVisibility, TestClassification)
2799 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
2800 for the individual tests
2801
2802 * test/support.py (FileLoadTestCase.filename): New base class for
2803 file loading tests
2804
2805 2003-05-21 Jan-Oliver Wagner <[email protected]>
2806
2807 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
2808 Mercator' to 'UTM Zone 32' as a more convenient example.
2809 Added 'Gauss Krueger Zone 6'.
2810
2811 * Data/iceland_sample_raster.thuban: political polygon now
2812 filled transparent to have the raster image visible at once.
2813
2814 2003-05-21 Frank Koormann <[email protected]>
2815
2816 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
2817 OnClose() to keep in sync with extensions. Internally Thuban
2818 still uses "underscored" names.
2819
2820 2003-05-20 Jonathan Coles <[email protected]>
2821
2822 This puts back Raster layer support. These layers support projections
2823 through the GDAL library. Currently, the CVS version is being used.
2824 There are no Debian packages available although this may change soon.
2825 A GDAL driver was extended to support writing to memory rather to
2826 files.
2827
2828 There is still some work that needs to be done, such as some error
2829 handling when loading invalid images or when there is a problem
2830 projecting the image. This putback simply checks in the majority
2831 of the work.
2832
2833 * setup.py: Add gdalwarp library extension.
2834
2835 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
2836 Defaults to False, but can be overridden by subclasses if they
2837 support classification.
2838 (RasterLayer): New. Defines a new layer that represents an
2839 image.
2840
2841 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
2842 tag handler.
2843 (SessionLoader.start_layer): Encode the filename.
2844 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
2845 New. Supports reading a rasterlayer tag.
2846
2847 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
2848
2849 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
2850 get a string in Latin1. If we get such as string convert it to
2851 unicode first, otherwise leave if alone before encoding.
2852 (SessionSaver.write_layer): Add support for writing both Layers
2853 and RasterLayers.
2854
2855 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
2856 The right argument may not be a string, it could also be a Column.
2857
2858 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
2859 Make initial window size 600x400. Fixes RTBug #1872.
2860
2861 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
2862 the dialog is constructed so that we can support layers that
2863 do not have classifications.
2864 (Classifier._OnTry): Only build a classification if the layer
2865 supports one.
2866
2867 * Thuban/UI/legend.py: Change all checks that a layer is an
2868 instance of Layer into checks against BaseLayer.
2869 (LegendTree.__FillTreeLayer): Only add children to a branch if
2870 the layer supports classification.
2871
2872 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
2873 MainWindow.OpenSession): Don't proceed with an action if the
2874 user chooses Cancel when they are asked to save changes.
2875 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
2876 user to select an image file. Create a new RasterLayer and add
2877 it to the map.
2878
2879 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
2880 for rendering RasterLayer layers.
2881 (MapRenderer.draw_raster_layer): Actually method that calls
2882 the GDALWarp python wrapper and constructs an image from the
2883 data returned.
2884
2885 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
2886 Choices symbols to match those used in the table query method.
2887 Replace deprecated method calls on table with new method names.
2888
2889 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
2890 how small the scale can get. This still needs more testing.
2891
2892 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
2893 Provides a driver to output in .bmp format.
2894
2895 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
2896 New. Provides IO routines which write to memory, rather than a file.
2897
2898 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
2899 of the gdalwarp utility provided in GDAL. Added function calls
2900 that can be accessed from python.
2901
2902 * Data/iceland_sample_raster.thuban: New. Sample file that uses
2903 a raster layer.
2904
2905 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
2906 layer image data.
2907
2908 * Doc/thuban.dtd: Added rasterlayer attribute definition.
2909
2910 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
2911 tests associated with the raster layer code.
2912
2913 * test/test_transientdb.py
2914 (TestTransientTable.test_auto_transient_table_query): Added a test
2915 for using a Column object as the "right" parameter to a query.
2916
2917 2003-05-19 Frank Koormann <[email protected]>
2918
2919 * Thuban/version.py (get_changelog_date):
2920 Catch exceptions if ChangeLog does not exist.
2921
2922 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
2923
2924 2003-05-19 Frank Koormann <[email protected]>
2925
2926 Extended version information for Thuban
2927
2928 * Thuban/version.py: New, version information for Thuban: Last
2929 modification date and last ChangeLog entry date.
2930
2931 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
2932 information: Display Thuban, wxPython and Python version.
2933
2934 2003-05-16 Bernhard Herzog <[email protected]>
2935
2936 * Thuban/Model/save.py: Remove some unused imports including the
2937 __future__ import for nested_scopes as Thuban relies on Python 2.2
2938 now.
2939 (XMLWriter.encode): Remove the special case for a None argument.
2940 In the saver encode is always called with a string argument.
2941
2942 2003-05-16 Bernhard Herzog <[email protected]>
2943
2944 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
2945 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
2946 of the bug was that e.g. float("1.2") would fail. Thuban now
2947 requires 2.4.x.
2948
2949 2003-05-16 Frank Koormann <[email protected]>
2950
2951 Printing enhancement and WMF export (under Win32)
2952
2953 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
2954 ScreenRenderer. Renders Map, Legend and Scalebar for export.
2955 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
2956 PrintRender.
2957
2958 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
2959 to fullfil information needed for PrinterRenderer.
2960 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
2961 (MapCanvas.Print): Adapted to new MapPrintout.
2962 (OutputTransform): General calculations to transform from canvas
2963 coordinates to export/printing devices.
2964
2965 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
2966 new method_command to call ExportMap, with platform dependency (only
2967 __WXMSW__)
2968
2969 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
2970 of scalebar drawing area as new parameters.
2971
2972 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
2973
2974 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
2975 Update to extended scalebar.DrawScalebar header.
2976
2977 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
2978
2979 * test/test_scalebar.py: Made test executable as standalone.
2980
2981 2003-05-16 Bernhard Herzog <[email protected]>
2982
2983 * Thuban/Model/table.py (Table): Remove this compatibility alias
2984 for DBFTable.
2985
2986 * test/test_table.py: Import DBFTable as Table because that alias
2987 doesn't exist anymore.
2988
2989 * Thuban/UI/classgen.py: Remove some unused imports
2990
2991 2003-05-14 Jonathan Coles <[email protected]>
2992
2993 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
2994 Fix docstring.
2995 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
2996 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
2997 values of the supplied range to determine the beginning and end
2998 bounds of the generated classes.
2999
3000 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
3001 do not have a leading 0 (.5 is now accepted as well as 0.5).
3002
3003 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
3004 call to ClassGenerator.GenUniformDistribution.
3005
3006 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
3007 layout bug with the 'Projection' label.
3008
3009 * test/support.py (FloatTestCase): New. Needed for the Range tests.
3010
3011 * test/test_range.py: New. Imported from SciParam.
3012
3013 2003-05-12 Jonathan Coles <[email protected]>
3014
3015 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
3016 to table.UniqueValues() with calls that retrieve all the values
3017 from the table. This will need to be replaced by a method on table
3018 which can simply return the list (perhaps more efficiently).
3019
3020 2003-05-12 Jonathan Coles <[email protected]>
3021
3022 The return value of ClassGenerator.CalculateQuantiles has changed.
3023 Refer to the documentation for details.
3024
3025 * test/test_classgen.py: Modified Quantile tests to use the
3026 new return values.
3027
3028 * Thuban/Model/classgen.py
3029 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
3030 use new return values from CalculateQuantiles to produce the correct
3031 range bounds in the Classification.
3032 (ClassGenerator.CalculateQuantiles): Add more comments describing
3033 the return values and parameters. Make minor adjustments to improve
3034 the legibility of the code. Fix problem with adjusted not being set
3035 in most cases.
3036
3037 2003-05-12 Frank Koormann <[email protected]>
3038
3039 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
3040 and latin1. Fixes #1851 finally.
3041
3042 2003-05-09 Jonathan Coles <[email protected]>
3043
3044 * test/test_classgen.py: New. Tests the Quantile algorithm.
3045
3046 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
3047 Clean up debugging statement, add comments, fix a small bug in the
3048 returned adjusted percentiles.
3049
3050 2003-05-09 Jonathan Coles <[email protected]>
3051
3052 Introduces Range class from SciParam into the ClassGroupRange class,
3053 and such ranges can now be saved and loaded from disk.
3054
3055 Quantiles are now available in the Classification Generator.
3056
3057 Initial support for building Queries on a table. Doesn't do anything
3058 but run some tests.
3059
3060 * Thuban/Model/classification.py: Explicit imports.
3061 (ClassGroupRange): Use the Range class to store the underlying
3062 range information. The interface remains the same, except for
3063 GetRange(), and you can also supply a Range object as the min
3064 parameter to SetRange or __init__.
3065
3066 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
3067 string appropriately for use in Thuban. Fixes RTbug #1851.
3068 (SessionLoader.end_projection): Handle the context of the
3069 projection tag a bit better by looking at what objects are not
3070 None. There was an assumption that a projection tag for a map
3071 could occur before any layers.
3072 (SessionLoader.start_clrange): Provide backward compatibility for
3073 reading min/max values as well as the new range parameter.
3074
3075 * Thuban/Model/map.py: Explicit imports.
3076
3077 * Thuban/Model/resource.py: Import _.
3078 (ProjFileSaver.write): write header using projfile.dtd.
3079
3080 * Thuban/Model/save.py: Explicit imports.
3081 (XMLWriter.encode): New. Encode the given string from a format
3082 used by Thuban into UTF-8. Fixes RTbug #1851.
3083
3084 * Thuban/UI/classgen.py: Explicit imports.
3085 (ClassGenDialog.__init__): Clean up the code and add support
3086 for Quantiles.
3087 (ClassGenDialog.OnOK): Add support for Quantiles.
3088 (GenQuantilesPanel): New. Input panel for Quantiles.
3089 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
3090 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
3091
3092 * Thuban/Model/classgen.py: New. Contains all the classes named above.
3093
3094 * Thuban/UI/classifier.py: Explicit imports.
3095 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
3096 ClassTable.SetValueAsCustom): Reworked to use new Range class.
3097
3098 * Thuban/UI/legend.py: Explicit imports.
3099
3100 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
3101 a Table menu and associated method calls.
3102 (MainWindow.choose_color): Removed. No longer needed.
3103
3104 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
3105 should be disabled if no projection is selected in the available
3106 list.
3107
3108 * Thuban/UI/renderer.py: Explicit imports.
3109
3110 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
3111 with correctly selecting the rows and issuing the right events.
3112 Be sure to call Skip() to allow the grid to do some of its own
3113 handling which allows the rows to actually be selected.
3114 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
3115 selecting multiple shapes.
3116 (LayerTableFrame): Support for building Queries.
3117 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
3118
3119 * Thuban/UI/tree.py: Explicit imports.
3120
3121 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
3122 table view can call it.
3123
3124 * test/test_classification.py: Explicit imports.
3125 (TestClassification.test_ClassGroupRange): Fix test for new
3126 Range class.
3127
3128 * Doc/thuban.dtd: Add range parameter for clrange.
3129
3130 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
3131 object in ClassGroupRange, and also uesd for inputting ranges in
3132 the classifer table and elsewhere.
3133
3134 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
3135 yet.
3136
3137 2003-05-09 Frank Koormann <[email protected]>
3138
3139 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
3140
3141 2003-05-08 Frank Koormann <[email protected]>
3142
3143 Coding style updates
3144
3145 * test/test_scalebar.py: Replaced tab indentation by spaces.
3146
3147 * Thuban/UI/scalebar.py: Explicit imports.
3148
3149 2003-05-08 Frank Koormann <[email protected]>
3150
3151 * Thuban/UI/scalebar.py
3152 (ScaleBar.DrawScalebar): Format string bug fixed.
3153
3154 2003-05-08 Frank Koormann <[email protected]>
3155
3156 Reorganization of scalebar component (no wx in Thuban/Model)
3157
3158 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
3159 (deriveInterval):
3160 Calculate scalebar interval and unit which fits in width for scale.
3161 (roundInterval): Round float.
3162
3163 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
3164
3165 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
3166
3167 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
3168
3169 2003-05-08 Frank Koormann <[email protected]>
3170
3171 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
3172 Initialize ScaleBar with canvas.map
3173
3174 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
3175 round intervals to display smarter lengths
3176 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
3177 layer. If the maps has no projection applied grey the scalebar.
3178
3179 2003-05-07 Frank Koormann <[email protected]>
3180
3181 Basic Scalebar features added.
3182
3183 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
3184
3185 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
3186 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
3187 and the renderer.
3188
3189 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
3190
3191 * Thuban/UI/messages.py: SCALE_CHANGED added.
3192
3193 2003-05-07 Bernhard Herzog <[email protected]>
3194
3195 * Thuban/Model/session.py (Session.__init__): New instance
3196 variable shapestores to hold a list of all open shapestore objects
3197 (Session.ShapeStores): New. Accessor method for the shapestores
3198 list.
3199 (Session._add_shapestore, Session._clean_weak_store_refs): New.
3200 Internal methods to maintain the shapestores list.
3201 (Session.Tables): New. Return all tables open in the session.
3202 (Session.OpenShapefile): Insert the new ShapeStore into the
3203 shapestores list.
3204
3205 * test/test_session.py (TestSessionSimple.test_initial_state): Add
3206 tests for ShapeStores and Tables
3207 (TestSessionWithContent.test_shape_stores)
3208 (TestSessionWithContent.test_tables): New. Test cases for
3209 ShapeStores and Tables
3210
3211 2003-05-07 Bernhard Herzog <[email protected]>
3212
3213 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
3214 Add comments about the optimizations used.
3215 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
3216 Implement the ReadValue table interface method.
3217
3218 * test/test_transientdb.py
3219 (TestTransientTable.run_iceland_political_tests)
3220 (TestTransientTable.test_transient_joined_table): Add tests for
3221 ReadValue
3222
3223 2003-05-07 Frank Koormann <[email protected]>
3224
3225 * Resources/Bitmaps/fulllayerextent.xpm,
3226 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
3227 new icons.
3228
3229 2003-05-06 Bernhard Herzog <[email protected]>
3230
3231 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
3232 New. Simply delegate to the transient table's version.
3233
3234 * test/test_transientdb.py
3235 (TestTransientTable.test_auto_transient_table_query): New. Test
3236 case for AutoTransientTable's SimpleQuery
3237
3238 2003-05-06 Bernhard Herzog <[email protected]>
3239
3240 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
3241 Implement a simple query method for the query dialog
3242 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
3243 the row index or shapeid.
3244 (TransientTable.create): Insert the right value of the row index
3245 (TransientJoinedTable.create): Copy the row index of the left
3246 table to the joined result table
3247
3248 * test/test_transientdb.py
3249 (TestTransientTable.test_transient_table_read_twice): Fix
3250 doc-string
3251 (TestTransientTable.test_transient_table_query): New. Test for the
3252 SimpleQuery method
3253
3254 2003-05-06 Bernhard Herzog <[email protected]>
3255
3256 Convert all table users to use the new table interface. This only
3257 covers Thuban itself, not GREAT-ER or other applications built on
3258 Thuban yet, so the compatibility interface stays in place for the
3259 time being but it now issues DeprecationWarnings.
3260
3261 Finally, the new Table interface has a new method, HasColumn.
3262
3263 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
3264 issue deprecation warnings when they're. The warnings refer to the
3265 caller of the method.
3266 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
3267 for the deprecation warnings
3268
3269 * test/test_table.py: Ignore the deprecation warnings for the old
3270 table in the tests in this module. The purpose of the tests is to
3271 test the old interface, after all.
3272
3273 * test/test_transientdb.py
3274 (TestTransientTable.run_iceland_political_tests): Use the
3275 constants for the types. Add a test for HasColumn
3276 (TestTransientTable.test_transient_joined_table): Adapt to new
3277 table interface. Add a test for HasColumn
3278 (TestTransientTable.test_transient_table_read_twice): Adapt to new
3279 table interface
3280
3281 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
3282 Adapt to new table interface
3283
3284 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
3285 new table interface
3286
3287 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
3288 (RecordTable.SetTable): Adapt to new table interface
3289
3290 * Thuban/UI/classifier.py (Classifier.__init__)
3291 (Classifier.__init__): Adapt to new table interface
3292
3293 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
3294 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
3295 to new table interface
3296
3297 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
3298 (AutoTransientTable.HasColumn): Implement the new table interface
3299 method
3300 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
3301 (AutoTransientTable.UniqueValues): Adapt to new table interface
3302
3303 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
3304 Adapt to new table interface
3305
3306 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
3307 simplify opening shapefiles a bit easier.
3308 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3309 (TestLayer.test_point_layer): Use the new helper method
3310 (TestLayer.test_get_field_type): New. Test for the GetFieldType
3311 method
3312
3313 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
3314 the new table method
3315
3316 * test/test_memory_table.py (TestMemoryTable.test_has_column):
3317 Test for the new table method HasColumn
3318
3319 2003-05-06 Jonathan Coles <[email protected]>
3320
3321 Addresses the "Selection Extent" wish of RTbug #1787.
3322
3323 * Resources/Bitmaps/fulllayerextent.xpm,
3324 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
3325 extent. These are just place holders for the real bitmaps.
3326
3327 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
3328 calculate the bounding box once (the first time compute_bbox() is
3329 called).
3330 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
3331 the bounding box for the shapes in lat/long coordinates.
3332
3333 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
3334 option.
3335 (MainWindow.has_selected_shapes): New. Returns true if there are
3336 any selected shapes.
3337 (MainWindow.FullSelectionExtent): New. Calls
3338 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
3339 (_has_selected_shapes): New. Returns true if there are any
3340 selected shapes.
3341
3342 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
3343 true if there are any selected shapes.
3344
3345 * Thuban/UI/view.py (MapCanvas): Added delegated method
3346 HasSelectedShapes.
3347 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
3348 shapes on the canvas using the map projection (if any).
3349
3350 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
3351 for Layer.ShapesBoundingBox().
3352
3353 2003-05-06 Bernhard Herzog <[email protected]>
3354
3355 * Resources/Projections/defaults.proj: Fix spelling of Mercator
3356
3357 2003-05-05 Jonathan Coles <[email protected]>
3358
3359 Addresses the "Full Layer Extent" wish of RTbug #1787.
3360
3361 * Resources/Projections/defaults.proj: Added UK National Grid.
3362
3363 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
3364 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
3365 when the user selects the menu option.
3366
3367 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
3368 scales the given layer on the canvas using the map projection.
3369
3370 2003-05-05 Bernhard Herzog <[email protected]>
3371
3372 Convert the table implementations to a new table interface. All
3373 tables use a common mixin class to provide backwards compatibility
3374 until all table users have been updated.
3375
3376 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
3377 provide backwards compatibility for table classes implementing the
3378 new interface
3379 (DBFTable, MemoryTable): Implement the new table interface. Use
3380 OldTableInterfaceMixin as base for compatibility
3381 (DBFColumn, MemoryColumn): New. Column description for DBFTable
3382 and MemoryTable resp.
3383
3384 * test/test_dbf_table.py: New. Test cases for the DBFTable with
3385 the new table interface.
3386
3387 * test/test_memory_table.py: New. Test cases for the MemoryTable
3388 with the new table interface.
3389
3390 * test/test_table.py: Document the all tests in this file as only
3391 for backwards compatibility. The equivalent tests for the new
3392 interface are in test_memory_table.py and test_dbf_table.py
3393 (MemoryTableTest.test_read): field_info should be returning tuples
3394 with four items
3395 (MemoryTableTest.test_write): Make doc-string a more precise.
3396
3397 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
3398 table interface. Derive from from OldTableInterfaceMixin for
3399 compatibility.
3400 (TransientTableBase.create): New intance variable column_map to
3401 map from names and indices to column objects
3402 (TransientTable.create): Use the new table interface of the input
3403 table
3404 (AutoTransientTable): Convert to new table interface. Derive from
3405 from OldTableInterfaceMixin for compatibility.
3406 (AutoTransientTable.write_record): Removed. It's not implemented
3407 yet and we still have to decide how to handle writing with the new
3408 table and data framework.
3409
3410 * test/test_transientdb.py
3411 (TestTransientTable.run_iceland_political_tests)
3412 (TestTransientTable.test_transient_joined_table): Use the new
3413 table interface
3414
3415 2003-05-05 Jonathan Coles <[email protected]>
3416
3417 This is namely a collection of UI updates to improve user interactivity.
3418 Tabbing between controls now exists and you can use ESC to close dialog
3419 boxes; ENTER will active the default button.
3420
3421 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
3422 order that the controls are created so that tabbing works correctly.
3423 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
3424 wxDialog can handle the default button correctly.
3425 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
3426 same reasons as for OnOK.
3427 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
3428 when we ask the table for the maximum/minimum values of a field
3429 which could take a very long time.
3430
3431 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
3432 order that the controls are created so that tabbing works correctly.
3433 (SelectPropertiesDialog.__init__): Rearrange the order that the
3434 controls are created so that tabbing works correctly.
3435
3436 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
3437 to derive from a wxDialog but behave like the original implementation
3438 which was derived from a wxFrame. wxDialog provides useful key
3439 handling functionality like ESC calling OnCancel and ENTER calling
3440 OnOK which is lost with wxFrame.
3441
3442 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
3443 new dialogs.
3444
3445 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
3446 order that the controls are created so that tabbing works correctly.
3447 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
3448 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
3449 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
3450 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
3451 can provide the "UK National Grid" as a default projection.
3452 (UTMPanel.__init__): Rearrange the order that the controls are
3453 created so that tabbing works correctly.
3454
3455 2003-05-05 Bernhard Herzog <[email protected]>
3456
3457 * extensions/thuban/wxproj.cpp: Fix some of the comments.
3458 (project_point): If a map projection but no layer projection is
3459 given, convert degrees to radians before applying the map
3460 projection.
3461
3462 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
3463 (TableGrid.allow_messages): New methods to make it possible to
3464 inhibit message sending.
3465 (TableGrid.issue): Only send the message if not inhibited.
3466 (LayerTableGrid.select_shape): Use the new methods to make sure
3467 that no ROW_SELECTED message is sent while we're updating the
3468 selected rows to match the selected shapes.
3469
3470 2003-05-02 Jan-Oliver Wagner <[email protected]>
3471
3472 Implementation of MemoryTable.
3473
3474 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
3475 implementation that operates on a list of tuples. All of the data
3476 are kept in the memory.
3477
3478 * test/test_table.py (MemoryTableTest): New.
3479
3480 * test/test_transientdb.py (SimpleTable): Removed.
3481 (TestTransientTable.test_transient_joined_table,
3482 (TestTransientTable.test_transient_table_read_twice): Replaced
3483 SimpleTable by MemoryTable.
3484
3485 2003-04-30 Jonathan Coles <[email protected]>
3486
3487 * Data/iceland_sample.thuban: Now contains correct projections
3488 for each of the layers.
3489
3490 * Resources/Projections/defaults.proj: Geographic projection
3491 contains unit conversion parameter.
3492
3493 2003-04-30 Jonathan Coles <[email protected]>
3494
3495 The most important part of this putback is the projection changes.
3496 It should now be possible to specify the projection that a layer
3497 is in and then specify a different projection for the map. The
3498 projection dialog has an extra parameter for a geographic projection
3499 which lets the user select if the input is in degrees or radians.
3500
3501 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
3502 to say that the parameter is a tuple of unprojected
3503 points (which is what the callers to this method were assuming).
3504 Also, since the points are unprojected we need to projected them.
3505
3506 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
3507 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
3508 groups are selected, move the layer up/down. Fixes RTbug #1833.
3509
3510 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
3511
3512 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
3513 parameter in call to SetClientData.
3514 (GeoPanel): Add support for selecting the units that the
3515 source data is in (Radians or Degrees).
3516
3517 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
3518 the rendering loop by reducing the number of if's, removing the
3519 unnecessary try/except block, and checking if the old group
3520 is the same as the new one (which happens a lot if there is
3521 no classification, or lots of shapes are in the same group).
3522
3523 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
3524 around the redraw routine to try to catch problems that the user
3525 may create by selecting invalid projections for the data set and
3526 map. Clears the display if there are any problems and prints the
3527 error.
3528 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
3529 rectangle.
3530
3531 * extensions/thuban/wxproj.cpp (project_point): First invert the
3532 supplied point (which should be in projected coordinates) using
3533 the layer's projection and then project the point using the
3534 map's projection.
3535 (project_points): Use project_point() to project each point.
3536
3537 2003-04-30 Jan-Oliver Wagner <[email protected]>
3538
3539 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
3540 don't set the Classification to None if the classfication field
3541 is None (ie only a DEFAULT).
3542
3543 2003-04-30 Bernhard Herzog <[email protected]>
3544
3545 * Thuban/UI/view.py: Fix some typos.
3546
3547 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
3548 not pop up the dialog if the selection becomes empty (this could
3549 happen if e.g. a new selection is opened while the identify tool
3550 is active and dialog had been closed)
3551
3552 2003-04-30 Bernhard Herzog <[email protected]>
3553
3554 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
3555 instance variable read_record_last_result
3556 (TransientTableBase.read_record): Make sure reading the same
3557 record twice works. The implementation uses the new instance
3558 variable read_record_last_result
3559
3560 * test/test_transientdb.py
3561 (TestTransientTable.test_transient_table_read_twice): New test
3562 case for the above bug-fix.
3563
3564 2003-04-29 Jonathan Coles <[email protected]>
3565
3566 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
3567
3568 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
3569
3570 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
3571 (ClassTable.SetValueAsCustom): Rename keyword argument in
3572 ClassGroup* constructors to match argument name.
3573
3574 2003-04-29 Bernhard Herzog <[email protected]>
3575
3576 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
3577 transient DB if it exists to make sure it doesn't leave a journal
3578 file in the temp directory.
3579
3580 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
3581 self.conn to None after closing the connection to make sure it's
3582 not closed twice
3583
3584 2003-04-29 Jonathan Coles <[email protected]>
3585
3586 Add a visible parameter in the layer XML tag. The default value is
3587 "true". If anything other than "false" is specified we also assume
3588 "true". Addresses RTbug #1025.
3589
3590 * Doc/thuban.dtd: Add visible parameter to a layer.
3591
3592 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
3593 of visible from 1 to True.
3594 (Layer.__init__): Change default value of visible from 1 to True.
3595
3596 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
3597 parameter.
3598
3599 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
3600 parameter.
3601
3602 * test/test_load.py: Add new test data contents_test_visible.
3603 (LoadSessionTest.setUp): save test data.
3604 (LoadSessionTest.testLayerVisibility): Test if the visible flag
3605 is loaded correctly.
3606
3607 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
3608 for saving an invisible layer.
3609
3610 2003-04-29 Jonathan Coles <[email protected]>
3611
3612 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
3613 legend dialog box and tell it to change its map to the one
3614 supplied to SetMap(). Fixes RTbug #1770.
3615
3616 2003-04-29 Bernhard Herzog <[email protected]>
3617
3618 Next step of table implementation. Introduce a transient database
3619 using SQLite that some of the data is copied to on demand. This
3620 allows us to do joins and other operations that require an index
3621 for good performance with reasonable efficiency. Thuban now needs
3622 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
3623 haven't tested that.
3624
3625 * Thuban/Model/transientdb.py: New. Transient database
3626 implementation.
3627
3628 * test/test_transientdb.py: New. Tests for the transient DB
3629 classes.
3630
3631 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
3632 classes to help automatically remove temporary files and
3633 directories.
3634 (Session.__init__): New instance variables temp_dir for the
3635 temporary directory and transient_db for the SQLite database
3636 (Session.temp_directory): New. Create a temporary directory if not
3637 yet done and return its name. Use AutoRemoveDir to have it
3638 automatically deleted
3639 (Session.TransientDB): Instantiate the transient database if not
3640 done yet and return it.
3641
3642 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
3643 AutoTransientTable so that data is copied to the transient DB on
3644 demand.
3645 (SimpleStore): New class that simply combines a table and a
3646 shapefile
3647
3648 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
3649 DBFTable and update its doc-string to reflect the fact that this
3650 is only the table interface to a DBF file. Table is now an alias
3651 for DBFTable for temporary backwards compatibility.
3652
3653 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
3654 the last reference to the session goes away so that the temporary
3655 files are removed properly.
3656
3657 * test/test_load.py (LoadSessionTest.tearDown): Remove the
3658 reference to the session to make sure the temporary files are
3659 removed.
3660
3661 2003-04-29 Bernhard Herzog <[email protected]>
3662
3663 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
3664 the __parser instance variable into a normal local variable in
3665 read. It's only used there and read will never be called more than
3666 once. Plus it introduces a reference cycle that keeps can keep the
3667 session object alive for a long time.
3668
3669 2003-04-29 Jonathan Coles <[email protected]>
3670
3671 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
3672 Projection an immutable item. Fixes RTbug #1825.
3673 (Projection.__init__): Initialize instance variables here.
3674 (ProjFile.Replace): New. Replace the given projection object with
3675 the new projection object. This solves the problem of needing the
3676 mutator Projection.SetProjection() in the ProjFrame class and
3677 allows a projection to change parameters without changing its
3678 location in the file.
3679
3680 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
3681 be of type wxSAVE and should verify overwriting a file.
3682
3683 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
3684 ProjFile.Replace() method instead of the mutator
3685 Projection.SetProjection(). Also requires that we reassign the
3686 client data to the new projection.
3687
3688 * test/test_proj.py (TestProjection.test): Test GetName() and
3689 GetAllParameters()
3690 (TestProjFile.test): Remove tests for Set*() methods. Add tests
3691 for Replace().
3692
3693 2003-04-25 Jonathan Coles <[email protected]>
3694
3695 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
3696 to save the name of the projection.
3697
3698 * test/test_save.py (SaveSessionTest.testLayerProjection): New
3699 test to verify layer projections are saved correctly.
3700
3701 2003-04-25 Jonathan Coles <[email protected]>
3702
3703 * Thuban/Model/proj.py (Projection.SetName): Set the name
3704 to "Unknown" if name is None.
3705 (Projection.SetAllParameters): New. Set the projection's
3706 parameter list to the one supplied.
3707 (Projection.SetProjection): New. Set the projection's
3708 properties to those of the supplied Projection.
3709
3710 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
3711 the dialog title to include the map's title.
3712 (MainWindow.LayerProjection): Set the dialog title to include
3713 the layer's title.
3714
3715 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
3716 error dialogs into a single method call.
3717 (ProjFrame.__VerifyButtons): Add more states to check.
3718 (ProjFrame.__GetProjection): Return the current state of an
3719 edited projection or None.
3720 (ProjFrame.__FillAvailList): Remove checks for states that
3721 shouldn't exist.
3722 (ProjFrame._OnNew): Clear all selected items and supply
3723 a projection panel if necessary.
3724
3725 * test/test_proj.py (TestProjFile.test): Add tests for
3726 ProjFile.SetAllParameters, ProjFile.SetProjection,
3727 ProjFile.SetName.
3728
3729 2003-04-25 Jonathan Coles <[email protected]>
3730
3731 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
3732 takes an optional argument to select the current projection.
3733 This does not guarantee that the item is visible due to
3734 limited wxWindows functionality. Fixes RTBug #1821.
3735
3736 2003-04-25 Jonathan Coles <[email protected]>
3737
3738 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
3739 the projection name and use it when constructing the Projection
3740 object.
3741
3742 * Thuban/Model/proj.py (Projection.__init__): Change the default
3743 value for 'name' to None and then test if name is equal to None
3744 in the body of the constructor. This way the caller doesn't have to
3745 know what the default value should be. Namely, useful in load.py
3746 where we have to pick a default value if the 'name' parameter
3747 doesn't exist in the XML file.
3748
3749 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
3750 Tests a file where a layer has a projection.
3751
3752 2003-04-25 Jonathan Coles <[email protected]>
3753
3754 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
3755 tree for projection information.
3756
3757 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
3758 XMLReader.GetFileName.
3759 (SessionLoader): Added support for loading projection tags that
3760 appear inside a layer.
3761
3762 * Thuban/Model/proj.py (ProjFile): Document the class. Move
3763 back to using a list because the order of the projections in
3764 the file is important to maintain. Fixes RTbug #1817.
3765
3766 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
3767 to ProjFile.GetFilename.
3768
3769 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
3770 information.
3771
3772 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
3773 ProjFrame._OnSaveAs. Removed old dead code from previous
3774 implementation.
3775 (ProjFrame._OnExport): Add support for exporting more than one
3776 projection to a single file.
3777 (ProjFrame.__FillAvailList): use string formatting (% operator)
3778 to build strings that are (partly) translated. Fixes RTbug #1818.
3779
3780 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
3781 class.
3782
3783 2003-04-24 Bernhard Herzog <[email protected]>
3784
3785 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
3786
3787 * po/fr.po: New. French translation by Daniel Calvelo Aros
3788
3789 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
3790 empty strings.
3791
3792 2003-04-24 Jonathan Coles <[email protected]>
3793
3794 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
3795 implement the interface that the ProjFrame dialog expects.
3796
3797 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
3798 name of the projection to be changed.
3799 (ProjFile): Use a dictionary instead of a list so that removing
3800 projections is easier and we are sure about uniqueness.
3801 (ProjFile.Remove): Remove the given projection object.
3802
3803 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
3804 Return a list with only one projection file instead of searching for
3805 any projection file. This simplifies many things if the user can
3806 only have one system file and one user file.
3807
3808 * Thuban/UI/classgen.py: Change all references to
3809 genCombo to genChoice.
3810
3811 * Thuban/UI/mainwindow.py: Add a Projection option under the
3812 layer menu.
3813 (MainWindow.LayerProjection): New. Open up a projection window
3814 for a layer.
3815
3816 * Thuban/UI/projdialog.py: Large changes to how the dialog is
3817 laid out. Use three panels instead of one. One for the list of
3818 projections, one for the edit controls, and one for the buttons.
3819 Fixed resizing problems so that the dialog resizes correctly
3820 when the projection panel changes. Added import/export, save, and
3821 new buttons/functionality.
3822
3823 2003-04-24 Bernhard Herzog <[email protected]>
3824
3825 First step towards table management. Introduce a simple data
3826 abstraction so that we replace the data a layer uses more easily
3827 in the next step.
3828
3829 * Thuban/Model/data.py: New file with a simple data abstraction
3830 that bundles shapefile and dbffile into one object.
3831
3832 * Thuban/Model/session.py (Session.OpenShapefile): New method to
3833 open shapefiles and return a shape store object
3834
3835 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
3836 object instead of a shapefile filename. This introduces a new
3837 instance variable store holding the datastore. For intermediate
3838 backwards compatibility keep the old instance variables.
3839 (open_shapefile): Removed. No longer needed with the shape store.
3840 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
3841 get the shape store used by a layer.
3842 (Layer.Destroy): No need to explicitly destroy the shapefile or
3843 table anymore.
3844
3845 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
3846 (MainWindow.AddLayer): Use the session's OpenShapefile method to
3847 open shapefiles
3848
3849 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
3850 session's OpenShapefile method to open shapefiles
3851
3852 * test/test_classification.py
3853 (TestClassification.test_classification): Use the session's
3854 OpenShapefile method to open shapefiles and build the filename in
3855 a more platform independed way
3856
3857 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
3858 Implement to have a session to use in the tests
3859 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3860 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
3861 session's OpenShapefile method to open shapefiles
3862 (TestLayerLegend.setUp): Instantiate a session so that we can use
3863 it to open shapefiles.
3864 (TestLayerLegend.tearDown): Make sure that all references to
3865 layers and session are removed otherwise we may get a resource
3866 leak
3867
3868 * test/test_map.py (TestMapAddLayer.test_add_layer)
3869 (TestMapWithContents.setUp): Instantiate a session so that we can
3870 use it to open shapefiles.
3871 (TestMapWithContents.tearDown): Make sure that all references to
3872 layers, maps and sessions are removed otherwise we may get a
3873 resource leak
3874 ("__main__"): use support.run_tests() so that more info about
3875 uncollected garbage is printed
3876
3877 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
3878 session's OpenShapefile method to open shapefiles
3879 ("__main__"): use support.run_tests() so that more info about
3880 uncollected garbage is printed
3881
3882 * test/test_selection.py (TestSelection.tearDown): Make sure that
3883 all references to the session and the selection are removed
3884 otherwise we may get a resource leak
3885 (TestSelection.get_layer): Instantiate a session so that we can
3886 use it to open shapefiles.
3887 ("__main__"): use support.run_tests() so that more info about
3888 uncollected garbage is printed
3889
3890 * test/test_session.py (TestSessionBase.tearDown)
3891 (TestSessionWithContent.tearDown): Make sure that all references
3892 to the session and layers are removed otherwise we may get a
3893 resource leak
3894 (TestSessionWithContent.setUp): Use the session's OpenShapefile
3895 method to open shapefiles
3896
3897 2003-04-24 Jonathan Coles <[email protected]>
3898
3899 * Thuban/Model/load.py (XMLReader.read): Should have been checking
3900 if the file_or_filename object had the 'read' attribute.
3901
3902 2003-04-23 Jonathan Coles <[email protected]>
3903
3904 * Thuban/Model/resource.py: Fixes RTbug #1813.
3905 (ReadProjFile): Add documentation about which exceptions are raised.
3906 Always pass the exceptions up to the caller.
3907 (GetProjFiles): If the directory can't be read return an empty list.
3908 If any of the proj files can't be read skip that file and go
3909 on to the next one.
3910
3911 * test/test_proj.py: Added test cases to handle nonexistent files,
3912 unreadable files, and files that don't parse correctly.
3913
3914 2003-04-23 Jonathan Coles <[email protected]>
3915
3916 Projection dialog. Allows the user to select from a list
3917 of projection templates and optionally edit them and save new ones.
3918
3919 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
3920 (ProjPanel): Base class for projection specific panels.
3921 (TMPanel): Projection panel for Transverse Mercartor.
3922 (UTMPanel): Projection panel for Universal Transverse Mercartor.
3923 (LCCPanel): Projection panel for Lambert Conic Conformal.
3924 (GeoPanel): Projetion panel for Geographic Projection.
3925
3926 2003-04-23 Jonathan Coles <[email protected]>
3927
3928 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
3929 promote symmetry. There now exists XMLReader and XMLWriter.
3930 (XMLReader.read): New. Call to read the given file descriptor or
3931 filename.
3932 (XMLReader.close): New. Make sure the file is closed.
3933 (XMLReader.GetFileName): New. Return just the file name that is being
3934 read from.
3935 (XMLReader.GetDirectory): New. Return just the directory of the file
3936 that is being read.
3937 (XMLReader.AddDispatchers): New. Take a dictionary which contains
3938 the names of functions to call as the XML tree is parsed.
3939 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
3940 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
3941 (SessionLoader): Removed class variables start_dispatcher and
3942 end_dispatcher since this functionality is now part of a class
3943 instance. Fixes RTbug #1808.
3944 (SessionLoader.__init__): Add dispatcher functions.
3945 (load_xmlfile): Code was moved into the XMLReader.read().
3946 (load_session): Use modified SessionLoader.
3947
3948 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
3949 map's projection.
3950
3951 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
3952 GetAllParameters.
3953 (Projection.GetParameter): Returns the value for the given parameter.
3954
3955 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
3956 (GetProjFiles): Renamed from GetProjections. Now returns a list
3957 of ProjFile objects.
3958 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
3959 a list of ProjFile objects whose files are not user defined.
3960 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
3961 list of ProjFile objects whose files are user defined.
3962 (ProjFileReader): Extend new XMLReader.
3963
3964 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
3965 promote symmetry.
3966
3967 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
3968 control instead of a wxComboBox. wxChoice controls do not generate
3969 events as the uses highlights possible choices which fixes problems
3970 with resizing the dialog when the use selects an option.
3971
3972 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
3973 control instead of a wxComboBox.
3974
3975 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
3976 dialog.
3977
3978 * test/test_proj.py (TestProjection.test): New tests for GetParameter
3979 method.
3980
3981 2003-04-22 Bernhard Herzog <[email protected]>
3982
3983 * Thuban/UI/mainwindow.py: Remove some unused imports and global
3984 constants
3985
3986 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
3987 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
3988
3989 2003-04-17 Bernhard Herzog <[email protected]>
3990
3991 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
3992 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
3993 anymore.
3994 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
3995 (Layer.ShapeType, Layer.Shape): No need to call
3996 self.open_shapefile since it's always called in __init__
3997
3998 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
3999 In wxPython 2.4 there's no need to extend MainLoop anymore since
4000 wxPython itself makes sure OnExit is called.
4001
4002 2003-04-16 Jonathan Coles <[email protected]>
4003
4004 Initial putback of projection management code. Includes new
4005 classes to read and write projection files. The current load
4006 and save classes were abstracted a bit so they could be reused.
4007 The Projection class was extended to provide new methods and
4008 have a name.
4009
4010 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
4011 general XML reading methods that were part of ProcessSession.
4012
4013 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
4014 name.
4015 (ProjFile): New. Represents a file that contains projection
4016 information.
4017
4018 * Thuban/Model/resource.py: New. Contains general utilities
4019 for read and writing projection files.
4020
4021 * Thuban/Model/save.py (XMLSaver): New. Contains all the
4022 general XML writing methods that were part of SessionSaver.
4023 (SessionSaver): Renamed from Saver.
4024
4025 * test/test_proj.py: New test cases for the projection
4026 file read and write functions.
4027
4028 2003-04-16 Jonathan Coles <[email protected]>
4029
4030 * Thuban/Model/classification.py: Use repr() around values
4031 in the ClassGroup*.__repr__() methods so it is clearer when
4032 a value is a string and when it is a number.
4033
4034 * test/test_load.py: Rework the classification test to test
4035 that we can load old files.
4036 (testLabels): Test a file where the groups have labels.
4037
4038 2003-04-16 Bernhard Herzog <[email protected]>
4039
4040 Safer implementation of the performance enhancements of the
4041 low-level renderer:
4042
4043 * extensions/thuban/wxproj.cpp (extract_projection)
4044 (extract_pointer): Rename extract_projection to extract_pointer
4045 and redefine its purpose to return the pointer stored in a CObject
4046 returned by the object's cobject method. Update all callers.
4047 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
4048 handling of these low-level parameters so that each s_draw_info
4049 instance is handled as a CObject at python level that also
4050 contains real references to the actual python objects which
4051 contain the values in the struct. Add free_draw_info as the
4052 destructor.
4053 (draw_polygon_shape): Add the py_draw_info parameter which must a
4054 cobject containing an s_draw_info pointer.
4055
4056 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
4057 method to instantiat the low-level render parameter
4058 (MapRenderer.draw_shape_layer): Use the new method. Remove some
4059 commented out code.
4060 (MapRenderer.draw_polygon_shape): Make the first parameter not the
4061 layer but the low-level render parameter
4062 (ScreenRenderer.draw_shape_layer): Use the low-level render
4063 parameter.
4064
4065 2003-04-15 Jonathan Coles <[email protected]>
4066
4067 * Thuban/Model/classification.py: Implemented __repr__ for
4068 the ClassGroup* classes to make debugging a bit easier.
4069 (ClassGroup.SetLabel): Check that the string is an instance
4070 of StringTypes not StringType. Accounts for Unicode strings.
4071
4072 * Thuban/Model/color.py: Implemented __repr__ to make
4073 debugging a bit easier.
4074
4075 * Thuban/Model/save.py (Saver.write_classification): Need to
4076 save the group label.
4077
4078 * test/test_load.py (testClassification): New. Loads the
4079 iceland_sample_test.thuban file and checks if it was loaded
4080 correctly.
4081
4082 2003-04-15 Jonathan Coles <[email protected]>
4083
4084 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
4085 to improve rendering performance by initializing the variables
4086 that are not change each time draw_polygon_shape() is called.
4087 The values are stored in a global struct draw_info.
4088 (draw_polygon_shape): Removed initialization code that is
4089 now in draw_polygon_init().
4090
4091 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
4092 drawing initialization call to draw_polygon_init()
4093 (MapRenderer.draw_polygon_shape): Use new signature of
4094 draw_polygon_shape.
4095
4096 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
4097 weirdness by setting the range to (1, maxint).
4098
4099 * Thuban/Model/classification.py (ClassGroupProperties): Make
4100 instance variables private and optimize comparison operator
4101 by first checking if the color references are the same.
4102 (ClassGroupSingleton): Make instance variables private.
4103 (ClassGroupRange): Make instance variables private.
4104
4105 * HOWTO-Release: Filled in missing steps for releasing packages.
4106
4107 2003-04-15 Bernhard Herzog <[email protected]>
4108
4109 First stab at internationalized messages:
4110
4111 * Thuban/__init__.py (_): Implement the translation function for
4112 real using the python gettext module.
4113
4114 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
4115 translate empty strings.
4116
4117 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4118 Add a missing space to a warning message
4119
4120 * po/README: New. Notes about the management of the translation
4121 files.
4122
4123 * po/Makefile: New. Makefile to help manage the translation files.
4124
4125 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
4126
4127 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
4128 translations and support files in po/
4129
4130 * setup.py (data_files): Add the *.mo files to the data_files too
4131
4132 * README: Add note about the translations when building from CVS
4133
4134 2003-04-14 Jonathan Coles <[email protected]>
4135
4136 * Thuban/UI/dock.py: Fixes some window resizing problems most
4137 noticable under windows. Always assume the button bitmaps will
4138 be there. Code clean up.
4139 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
4140 images for the dock/undock button to the same images.
4141 Work around for RTbug #1801.
4142
4143 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
4144 be allowed to grow within the sizer. Fixes a bug under Windows
4145 where the toolbar wasn't being drawn.
4146
4147 2003-04-14 Frank Koormann <[email protected]>
4148
4149 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
4150 Updated design to try to make the button functionality more
4151 transparent.
4152
4153 2003-04-14 Jonathan Coles <[email protected]>
4154
4155 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
4156 finalize the intialization of the panel.
4157
4158 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
4159 creation of the panel. Should be the last thing called in the
4160 initializer of a subclass.
4161
4162 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
4163 set the current selections in the combo boxes. This is needed
4164 under Windows.
4165
4166 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
4167 level panel to the dialog so that the background colors are
4168 consistent under Windows.
4169
4170 2003-04-11 Jonathan Coles <[email protected]>
4171
4172 * Thuban/UI/classgen.py: Change color ramps to start at white
4173 not black.
4174
4175 * Thuban/UI/legend.py: Enable/disable the legend buttons when
4176 the legend changes. Fixes RTbug #1793.
4177
4178 * test/test_classification.py: Added test for copying of
4179 classifications.
4180
4181 2003-04-11 Jonathan Coles <[email protected]>
4182
4183 * Thuban/UI/resource.py: New. Centralize the loading of resources
4184 such as bitmaps.
4185
4186 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
4187 added images to the move buttons, added 'reverse' button.
4188 (CustomRampPanel.__init__): Added images to the move buttons.
4189 (GreyRamp): New. Generates a ramp from white to black.
4190 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
4191
4192 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
4193 ID_PROPERTY_*.
4194 (Classifier.__init__): Minor changes to the layout.
4195 (Classifier._OnTitleChanged): Listen for when the user edits the
4196 title and update the dialog's title and the layer's title.
4197
4198 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
4199
4200 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
4201 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
4202 if the layer's title changes.
4203
4204 * Thuban/UI/mainwindow.py: Added new menu item and associated code
4205 to open a dialog to rename the map.
4206 (MainWindow): Use new resource class to import bitmaps.
4207
4208 2003-04-11 Jonathan Coles <[email protected]>
4209
4210 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
4211 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
4212 Resources/Bitmaps/group_use_none.xpm,
4213 Resources/Bitmaps/group_use_not.xpm,
4214 Resources/Bitmaps/hide_layer.xpm,
4215 Resources/Bitmaps/layer_properties.xpm,
4216 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
4217 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
4218 New.
4219
4220 2003-04-10 Jonathan Coles <[email protected]>
4221
4222 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
4223 Should pass group to ClassGroup constructor.
4224
4225 2003-04-10 Jonathan Coles <[email protected]>
4226
4227 * Thuban/Model/classification.py: (ClassGroup): Move all the common
4228 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
4229 here. Implement SetVisible(), IsVisible().
4230 (ClassGroup.__init__): Add group parameter which acts as a copy
4231 constructor.
4232
4233 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
4234 "Visible" check boxes.
4235 (Classifier): Rename the buttons and refactor the code to match
4236 the new labels.
4237
4238 * Thuban/UI/legend.py: Classify button is now called "Properties".
4239 Refactored the code to change variable names.
4240 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
4241
4242 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
4243 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
4244 renamed to MainWindow.LayerEditProperties.
4245 (MainWindow.ToggleLegend): Don't include map name in legend title.
4246 (MainWindow.SetMap): Added the map name to the window title.
4247 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
4248 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
4249 Functionality is found in the layer properties dialog.
4250
4251 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4252 draw visible groups.
4253
4254 2003-04-09 Jonathan Coles <[email protected]>
4255
4256 * Thuban/UI/classgen.py: Modifications to allow simple
4257 addition and selection of new color schemes.
4258 (MonochromaticRamp): New. Generates a ramp between two colors.
4259 (RedRamp): New. Generates a ramp of all red.
4260 (GreenRamp): New. Generates a ramp of all green.
4261 (BlueRamp): New. Generates a ramp of all blue.
4262
4263 2003-04-09 Jonathan Coles <[email protected]>
4264
4265 * Thuban/Model/classification.py (Classification.__deepcopy__):
4266 Need to copy over field and fieldType attributes.
4267
4268 * Thuban/Model/table.py (Table.field_range): New. Retrive the
4269 maximum and minimum values over the entire table for a given
4270 field.
4271 (Table.GetUniqueValues): New. Retrieve all the unique values
4272 in the table for a given field.
4273
4274 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
4275 (GenUniquePanel): New. Controls to allow the user to select
4276 which unique field values they would like in the classification.
4277 (CustomRampPanel): Code that was in ClassGenDialog that allows
4278 the user to select the properties for a custom ramp.
4279 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
4280
4281 * Thuban/UI/classifier.py: Removed a lot of debugging code.
4282 (Classifier._SetClassification): Callback method so that the
4283 class generator can set the classification in the grid.
4284 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
4285 editing of a group properties class into a wxWindows control.
4286
4287 * Thuban/UI/dock.py: It was decided that if the user closes
4288 a dockable window the window should simply hide itself. That
4289 way if the user wants to show the dock again it appears in the
4290 same place as it was when it was closed.
4291 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
4292 (DockableWindow._OnButtonClose): Hide the window instead of
4293 destroying it.
4294 (DockableWindow._OnClose): Hide the window instead of
4295 destroying it.
4296
4297 * Thuban/UI/legend.py (LegendTree): Use a private method to
4298 consistently set the font and style of the text. Fixes RTbug #1786.
4299
4300 * Thuban/UI/mainwindow.py: Import just the Classifier class.
4301
4302 2003-04-07 Bernhard Herzog <[email protected]>
4303
4304 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
4305 to the map module
4306
4307 2003-04-07 Bernhard Herzog <[email protected]>
4308
4309 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
4310 favor of ToggleSessionTree
4311 (MainWindow.ToggleSessionTree): New method to toggle visibility of
4312 the session tree.
4313 (MainWindow.SessionTreeShown): New method to return whether the
4314 session tree is currently shown.
4315 (MainWindow.ToggleLegend): New method to toggle visibility of the
4316 legend
4317 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
4318 LegendShown
4319 (MainWindow.LegendShown): New method to return whether the legend
4320 is currently shown.
4321 (_method_command): Add checked parameter so we can define check
4322 menu items
4323 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
4324 mainwindow methods.
4325 (show_session_tree, show_legend commands): Removed.
4326 (toggle_session_tree, toggle_legend commands): New commands to
4327 toggle the visibility of the dialogs
4328
4329 2003-04-07 Jonathan Coles <[email protected]>
4330
4331 * Thuban/UI/classgen.py: Fix Windows problem.
4332
4333 * Thuban/UI/dock.py: Fix Windows problem.
4334
4335 * Thuban/UI/mainwindow.py: Use False instead of false.
4336 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
4337
4338 2003-04-07 Jonathan Coles <[email protected]>
4339
4340 Since we now say that the order of the groups in a classification
4341 matters, it makes sense to be able to manipulate that order. Most
4342 of the changes to Thuban/Model/classification.py are to that end.
4343
4344 * Thuban/Model/classification.py (Classification.AppendGroup,
4345 Classification.InsertGroup, Classification.ReplaceGroup,
4346 Classification.RemoveGroup, Classification.GetGroup): Do as the
4347 names imply.
4348 (Classification.FindGroup): This was called GetGroup, but GetGroup
4349 takes an index, while FindGroup takes a value.
4350 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
4351 REFERENCE. Currently there is a cyclic reference between the layer
4352 and its classification. If the classification doesn't need to know
4353 its owning layer we can change this, since it may make sense to be
4354 able to use the same classification with different layers.
4355
4356 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
4357
4358 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
4359 not AddGroup()
4360
4361 * Thuban/UI/classifier.py: Now that we can depend on the order in
4362 a Classification and have methods to manipulate that order we don't
4363 need to use our own data structures in the grid. We can simply make
4364 the grid/table access the information they need from a copy of
4365 the classification object.
4366 (Classifier._OnCloseBtn): Event handler for when the user clicks
4367 'Close'. This is needed so if the user applies changes and then
4368 continues to change the table the user has the option of discarding
4369 the most recent changes and keeping what they applied.
4370
4371 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
4372 into the same group.
4373
4374 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
4375 with a really old version of proj, PJ_VERSION won't even be defined.
4376 If it isn't defined then just compile so that the function always
4377 returns Py_False.
4378
4379 * test/test_classification.py: Fix tests to use the renamed methods.
4380 Still need to write tests for the new methods.
4381
4382 2003-04-04 Jonathan Coles <[email protected]>
4383
4384 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
4385 call to SetSelection out of the method and before the call
4386 to __SelectField in __init__. This prevents a recursion of events
4387 when _OnFieldSelect is triggered by the user.
4388
4389 2003-04-04 Jonathan Coles <[email protected]>
4390
4391 * Thuban/Model/classification.py: Rename Color.None to
4392 Color.Transparent.
4393 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
4394 Don't bother copying the color, since Colors are immutable.
4395
4396 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
4397 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
4398 Thuban/UI/renderer.py, Thuban/UI/view.py:
4399 Rename Color.None to Color.Transparent.
4400
4401 * test/test_classification.py, test/test_load.py: Rename Color.None
4402 to Color.Transparent.
4403
4404 2003-04-04 Jonathan Coles <[email protected]>
4405
4406 * Thuban/Model/classification.py: Fix assert calls.
4407 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
4408 Copy the color parameter rather than hold onto a reference.
4409
4410 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
4411 the color object.
4412 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
4413 are sure there exists only one refernce to Color.None in the system.
4414 This allows us to use 'is' rather than the comparision functions.
4415
4416 * Thuban/Model/save.py: Fix assert calls.
4417
4418 * Thuban/UI/classifier.py: Fix assert calls.
4419 (ClassGrid._OnCellDClick): Call up to the classifier to open the
4420 dialog to edit the groups properties.
4421 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
4422 correctly if a cell is resized.
4423 (ClassTable.SetClassification): New. Changes the classification
4424 that is in the table.
4425 (ClassTable.__SetRow): Allow groups to be prepended.
4426 (Classifier): New code for opening the EditProperties and
4427 GenerateRanges dialogs.
4428 (SelectPropertiesDialog.__GetColor): Only set the color in the
4429 color dialog if the current color is not None.
4430
4431 * Thuban/UI/dock.py: Fix assert calls.
4432
4433 * Thuban/UI/legend.py: Fix assert calls.
4434
4435 * Thuban/UI/renderer.py: Fix assert calls.
4436
4437 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
4438 classifications.
4439 (GenRangePanel): Panel specific to range generation.
4440 (GenSingletonPanel): Panel specific to singleton generation.
4441 (ClassGenerator): Class responsible for actually generating
4442 the classification from the data gathered in the dialog box.
4443 (PropertyRamp): Generates properties whose values range from
4444 a starting property to an ending property.
4445
4446 2003-04-03 Bernhard Herzog <[email protected]>
4447
4448 * test/support.py (print_garbage_information): New function that
4449 prints information about still connected messages and memory
4450 leaks.
4451 (run_suite): Removed.
4452 (run_tests): New function for use as a replacement of
4453 unittest.main in the test_* files. This one calls
4454 print_garbage_information at the end.
4455
4456 * test/runtests.py (main): Use support.print_garbage_information
4457
4458 * test/test_layer.py: Use support.run_tests instead of
4459 unittest.main so we get memory leak information
4460 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4461 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4462 (TestLayerLegend.test_visibility): Call the layer's Destroy method
4463 to fix a memory leak.
4464
4465 * test/test_classification.py: Use support.run_tests instead of
4466 unittest.main so we get memory leak information
4467 (TestClassification.test_classification): Call the layer's Destroy
4468 method to fix a memory leak.
4469
4470 2003-04-02 Bernhard Herzog <[email protected]>
4471
4472 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4473 Handle the reference counts of the return value and errors in
4474 PyArg_ParseTuple correctly.
4475
4476 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4477 sure the filename is absolute to avoid problems when saving the
4478 session again
4479
4480 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
4481
4482 2003-04-01 Jonathan Coles <[email protected]>
4483
4484 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
4485 that there actually are points in the returned list of points
4486 before trying to index into the list. The list may be empty if
4487 the shape is a Null Shape.
4488
4489 2003-04-01 Bernhard Herzog <[email protected]>
4490
4491 * test/test_map.py: Don't use from <module> import *
4492
4493 2003-04-01 Jonathan Coles <[email protected]>
4494
4495 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
4496 LAYER_LEGEND_CHANGED
4497
4498 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
4499 self.Destroy() to close the window after yesterday's changes.
4500
4501 * test/test_map.py, test/test_session.py: Fix messages that
4502 are sent from maps and layers.
4503
4504 2003-03-31 Jonathan Coles <[email protected]>
4505
4506 * Thuban/UI/classifier.py: Commented out some debugging statements.
4507 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
4508 RTbug #1769.
4509
4510 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
4511 position (although position doesn't work yet under GTK).
4512 (DockableWindow.Destroy): New. Called when the window must be
4513 closed. Namely needed when the DockFrame closes and must close
4514 its children.
4515 (DockFrame): Listen for EVT_CLOSE and destroy all children.
4516
4517 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
4518 when then window is told to close.
4519 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
4520 comment in source for more info.
4521
4522 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
4523
4524 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
4525 symmetry with other such methods.
4526 (MainWindow.ShowLegend): Show the legend docked by default.
4527
4528 2003-03-28 Jonathan Coles <[email protected]>
4529
4530 * Thuban/UI/classifier.py: Support for highlighting a specific
4531 group within the grid when the classification dialog is opened.
4532 Also contains a lot of debugging printouts which will later
4533 be removed.
4534
4535 * Thuban/UI/dock.py: Complete rework on the dock code so that
4536 that it is fairly removed from the rest of the Thuban application.
4537 It is easy to add new docks which the rest of the program having
4538 to be aware of them.
4539
4540 * Thuban/UI/legend.py: Modifications to support selecting a
4541 specific group in the classification dialog. Changed how layers
4542 are drawn when the layer is visible/invisible.
4543
4544 * Thuban/UI/mainwindow.py: Removed legend specific code and
4545 replaced it with calls to the new dock code.
4546
4547 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
4548 to check if scale > 0. Trying to track down a divide by zero.
4549
4550 2003-03-26 Jonathan Coles <[email protected]>
4551
4552 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
4553 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
4554 now part of DockableWindow.
4555 (LegendPanel.DoOnSelChanged): Select the current layer in the
4556 map.
4557 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
4558 with the selected layer and/or group.
4559
4560 2003-03-26 Jonathan Coles <[email protected]>
4561
4562 This putback contains the code for dockable windows. There is
4563 no support in wxWindows as of this date for windows that can
4564 attach themselves to other windows.
4565
4566 The current model contains a DockableWindow which has a parent
4567 window for when it is detached and a dock window that it puts
4568 its contents in when it is docked. The contents of a DockableWindow
4569 must be a DockPanel. DockPanel itself derives from wxPanel.
4570
4571 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
4572 message, not a LAYER_LEGEND_CHANGED message.
4573
4574 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
4575
4576 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
4577 as one of the style properties for the fieldTypeText item to
4578 be sure that its size is correct when the text changes.
4579
4580 * Thuban/UI/dock.py: New. Classes for the DockPanel and
4581 DockableWindow.
4582
4583 * Thuban/UI/legend.py: Added some more buttons and made the
4584 LegendPanel a DockPanel.
4585
4586 * Thuban/UI/mainwindow.py: Added sash windows to the main window
4587 and supporting functions for manipulating the sashes.
4588 (MainWindow.ShowLegend): Create a DockableWindow with the
4589 LegendPanel as the contents.
4590
4591 * Thuban/UI/messages.py: Added DOCKABLE_* messages
4592
4593 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
4594 not LAYER_LEGEND_CHANGED, messages.
4595
4596 2003-03-25 Jonathan Coles <[email protected]>
4597
4598 * setup.py: Added custom script bdist_rpm_build_script so that
4599 when the rpm is built the path to wx-config is correct.
4600
4601 * setup.cfg: Added line saying to use the custom build script
4602
4603 2003-03-20 Jonathan Coles <[email protected]>
4604
4605 Initial implementation of the Legend.
4606
4607 * Thuban/UI/legend.py: New. Creates a window that shows the map's
4608 Legend information and allows the user to add/modify classifications
4609 and how the layers are drawn on the map.
4610
4611 * setup.py: New command 'build_docs' which currently uses
4612 happydoc to generate html documentation for Thuban.
4613
4614 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
4615 Returns a string which is appropriately describes the group.
4616
4617 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
4618 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
4619
4620 * Thuban/Model/map.py (Map): Rename messages and use new, more
4621 specific, messages.
4622
4623 * Thuban/Model/messages.py: New message to indicate that a layer's
4624 data has changed (LAYER_CHANGED). New map messages to indicate
4625 when layers have been added/removed/changed or if the stacking order
4626 of the layers has changed.
4627
4628 * Thuban/Model/session.py: Rename and use new messages.
4629
4630 * Thuban/UI/classifier.py: Remember if any changes have actually
4631 been applied so that if the dialog is cancelled without an application
4632 of changes we don't have to set a new classification.
4633 (ClassDataPreviewer): Pulled out the window specific code and put it
4634 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
4635 symbols on any DC.
4636
4637 * Thuban/UI/mainwindow.py: New code to open the legend.
4638
4639 * Thuban/UI/view.py: Use new message names.
4640
4641 2003-03-19 Jonathan Coles <[email protected]>
4642
4643 * Thuban/UI/main.py (verify_versions): New. Checks the versions
4644 of Python, wxPython, and some other libraries.
4645
4646 * extensions/thuban/wxproj.cpp (check_version): Checks the given
4647 version against what wxproj was compiled with.
4648 (check_version_gtk): If wxproj was compiled with gtk then check
4649 the given version against the version of the gtk library
4650 currently being used.
4651
4652 2003-03-14 Bernhard Herzog <[email protected]>
4653
4654 * test/test_command.py: Run the tests when the module is run as a
4655 script
4656
4657 2003-03-14 Bernhard Herzog <[email protected]>
4658
4659 Implement selection of multiple selected shapes in the same layer:
4660
4661 - Introduce a new class to hold the selection. This basically
4662 replaces the interactor which was nothing more than the
4663 selection anyway. A major difference is of course that the new
4664 selection class supports multiple selected shapes in one layer
4665
4666 - Move the object that represents the selection from the
4667 application to the canvas. The canvas is a better place than the
4668 application because the selection represents which shapes and
4669 layer of the map displayed by the canvas are selected and
4670 affects how the map is drawn.
4671
4672 - Make the selection and its messages publicly available through
4673 the mainwindow.
4674
4675 - The non-modal dialogs do not get a reference to the interactor
4676 anymore as they can simply refer to their parent, the
4677 mainwindow, for the what the interactor had to offer.
4678
4679 * Thuban/UI/selection.py: New module with a class to represent the
4680 selection.
4681
4682 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
4683 these unused messages
4684
4685 * Thuban/UI/application.py (ThubanApplication.OnInit)
4686 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
4687 interactor is gone now.
4688 (ThubanApplication.CreateMainWindow): There is no interactor
4689 anymore so we pass None as the interactor argument for now for
4690 compatibility.
4691
4692 * Thuban/UI/view.py (MapCanvas.delegated_messages)
4693 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
4694 Unsubscribe, delegate messages according to the delegated_messages
4695 class variable.
4696 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
4697 attributes from instance variables as described with the
4698 delegated_methods class variable.
4699 (MapCanvas.__init__): New instance variable selection holding the
4700 current selection
4701 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
4702 pass them on to the renderer
4703 (MapCanvas.SetMap): Clear the selection when a different map is
4704 selected.
4705 (MapCanvas.shape_selected): Simple force a complete redraw. The
4706 selection class now takes care of only issueing SHAPES_SELECTED
4707 messages when the set of selected shapes actually does change.
4708 (MapCanvas.SelectShapeAt): The selection is now managed in
4709 self.selection
4710
4711 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
4712 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
4713 Unsubscribe, delegate messages according to the delegated_messages
4714 class variable.
4715 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
4716 attributes from instance variables as described with the
4717 delegated_methods class variable.
4718 (MainWindow.__init__): The interactor as ivar is gone. The
4719 parameter is still there for compatibility. The selection messages
4720 now come from the canvas.
4721 (MainWindow.current_layer, MainWindow.has_selected_layer):
4722 Delegate to the the canvas.
4723 (MainWindow.LayerShowTable, MainWindow.Classify)
4724 (MainWindow.identify_view_on_demand): The dialogs don't need the
4725 interactor parameter anymore.
4726
4727 * Thuban/UI/tableview.py (TableFrame.__init__)
4728 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
4729 (LayerTableFrame.row_selected): The interactor is gone. It's job
4730 from the dialog's point of view is now done by the mainwindow,
4731 i.e. the parent. Subscribe to SHAPES_SELECTED instead
4732 of SELECTED_SHAPE
4733
4734 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
4735 is gone. It's job from the dialog's point of view is now done by
4736 the mainwindow, i.e. the parent.
4737
4738 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
4739 gone. It's job from the dialog's point of view is now done by the
4740 mainwindow, i.e. the parent.
4741
4742 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
4743 gone. It's job from the dialog's point of view is now done by the
4744 mainwindow, i.e. the parent.
4745 (SessionTreeCtrl.__init__): New parameter mainwindow which is
4746 stored as self.mainwindow. The mainwindow is need so that the tree
4747 can still subscribe to the selection messages.
4748 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
4749 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
4750 selection is now accessible through the mainwindow. Subscribe to
4751 SHAPES_SELECTED instead of SELECTED_SHAPE
4752
4753 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
4754 SHAPES_SELECTED message now.
4755 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
4756 so deal with multiple shapes
4757 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
4758 gone. It's job from the dialog's point of view is now done by the
4759 mainwindow, i.e. the parent.
4760
4761 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
4762 parameter is now a list of shape ids.
4763 (RecordTable.SetTable): The second parameter is now a list of
4764 indices.
4765
4766 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
4767 selected_shape parameter and ivar to selected_shapes. It's now a
4768 list of shape ids.
4769 (MapRenderer.draw_label_layer): Deal with multiple selected
4770 shapes. Rearrange the code a bit so that the setup and shape type
4771 distinctions are only executed once.
4772
4773 * test/test_selection.py: Test cases for the selection class
4774
4775 2003-03-11 Jonathan Coles <[email protected]>
4776
4777 * Thuban/Model/load.py: Temporary fix so that the xml reader
4778 doesn't cause Thuban to crash.
4779
4780 * Thuban/Model/layer.py: Handle the cyclic references between
4781 a layer and its classification better, and be sure to disconnect
4782 the classification from the layer when the layer is destroyed
4783 so that we don't maintain a cyclic reference that may not be
4784 garbage collected.
4785
4786 * Thuban/Model/classification.py: See comment for layer.py.
4787
4788 2003-03-12 Jan-Oliver Wagner <[email protected]>
4789
4790 * HOWTO-Release: New. Information on the steps for releasing
4791 a new version of Thuban.
4792
4793 2003-03-11 Jonathan Coles <[email protected]>
4794
4795 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
4796 Use True instead of true.
4797 (Classifier): Should have a single panel in which all the controls lie.
4798
4799 * Thuban/UI/proj4dialog.py: Add normal border.
4800
4801 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
4802
4803 * Thuban/UI/mainwindow.py: Use True instead of true.
4804
4805 * setup.py: Update some definitions to use wxWindows2.4 files
4806
4807 * Data/iceland_sample_class.thuban: Fixed file so that the
4808 field_type information is present.
4809
4810 2003-03-10 Jonathan Coles <[email protected]>
4811
4812 * Thuban/UI/classifier.py (Classifier.__init__): Make the
4813 field type label grow so that when the text changes the
4814 size is updated correctly. This may be a wxWindows bug.
4815
4816 2003-03-10 Jonathan Coles <[email protected]>
4817
4818 * Thuban/UI/application.py: Changed SESSION_CHANGED to
4819 SESSION_REPLACED.
4820
4821 * Thuban/UI/classifier.py: Wrap text with _().
4822 (ClassGrid.CreateTable): Set dimensions and size hints here,
4823 instead of in Reset, so we only set the size once.
4824
4825 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
4826
4827 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
4828 Call Close() instead of Shutdown().
4829
4830 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
4831
4832 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
4833 Go back to using OnClose() instead of Shutdown().
4834
4835 2003-03-10 Jonathan Coles <[email protected]>
4836
4837 * Thuban/UI/classifier.py (Classifier): SelectField() needed
4838 to know the old field index as well as the new one.
4839
4840 2003-03-10 Jonathan Coles <[email protected]>
4841
4842 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
4843 to correctly set the table information and call this from
4844 __init__ and from _OnFieldSelect so that all the information
4845 is up to date when the dialog opens and when a field is changed.
4846
4847 2003-03-10 Jonathan Coles <[email protected]>
4848
4849 * Thuban/Model/classification.py (Classification): Don't use
4850 layer's message function directly, use the ClassChanged() method
4851 when then classification changes. SetField/SetFieldType/SetLayer
4852 must keep the information about field name and field type in
4853 sync when an owning layer is set or removed.
4854
4855 * Thuban/Model/layer.py: Added ClassChanged() so that the
4856 classification can tell the layer when its data has changed.
4857 (Layer.SetClassification): Accepts None as an arguement to
4858 remove the current classification and correctly handles
4859 adding a new classification.
4860
4861 * Thuban/Model/load.py: Comment out print statement
4862
4863 * test/test_classification.py, test/test_save.py: New and
4864 improved tests.
4865
4866 2003-03-07 Jonathan Coles <[email protected]>
4867
4868 * Thuban/Model/classification.py: Implemented __copy__ and
4869 __deepcopy__ for ClassGroup* and ClassGroupProperites so
4870 they can easily be copied by the classifier dialog.
4871 (ClassGroupProperites.__init__): The default line color should
4872 have been Color.Black.
4873
4874 * Thuban/UI/classifier.py: Setting and Getting table values now
4875 uses a consistent set of functions.
4876 (Classifier): Now non-modal. Has field type label which changes
4877 as the field changes. Keep track of buttons in a list so that
4878 we can enable/disable the buttons when the None field is selected.
4879 (SelectPropertiesDialog): Add buttons to make the colors transparent.
4880
4881 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
4882 does what OnClose did, but can be called by the application to
4883 close a window. Needed when a session changes, and we have to
4884 close the classifier windows.
4885
4886 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
4887 Shuts down open dialogs. Used when a new session is created
4888 or a session is opened.
4889 (MainWindow.SaveSession): Should only call application.SaveSession()
4890 if we don't call SaveSessionAs first.
4891 (MainWindow.Classify): Allow different classifier dialogs for
4892 different layers.
4893
4894 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
4895 the parent class handle it. Add Shutdown() to unsubscibe from
4896 event notification and call the parent Shutdown(). This was
4897 necessary so the application can close the tree window.
4898
4899 2003-03-06 Jonathan Coles <[email protected]>
4900
4901 * Thuban/Model/classification.py: Minor documentation changes,
4902 Addition of __eq__ and __ne__ methods.
4903 (Classification.SetLayer): prevent recursion between this method
4904 and Layer.SetClassification().
4905
4906 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
4907
4908 * Thuban/Model/layer.py (SetClassification): prevent recursion
4909 between this method and Classification.SetLayer().
4910
4911 * test/test_classification.py, test/test_load.py,
4912 test/test_session.py: Fixed and added tests for the classification
4913 classes.
4914
4915 2003-03-06 Bernhard Herzog <[email protected]>
4916
4917 * Thuban/UI/classifier.py (ClassGrid.__init__)
4918 (ClassGrid.CreateTable): Move the SetSelectionMode call to
4919 CreateTable because otherwise it triggers an assertion in
4920 wxPython/wxGTK 2.4.
4921
4922 2003-03-05 Jonathan Coles <[email protected]>
4923
4924 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
4925
4926 * Thuban/Model/load.py: import FIELDTYPE constants from table.
4927
4928 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
4929
4930 * Thuban/Model/table.py: Put FIELDTYPE constants back.
4931
4932 2003-03-05 Jonathan Coles <[email protected]>
4933
4934 * Thuban/UI/classifier.py: Added class documentation.
4935 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
4936 Store just the groups in the table and generate the other
4937 column information when it is requested. Add "None" field
4938 to pull-down to select no classification.
4939
4940 * Thuban/common.py: Moved FIELDTYPE constants from table.py
4941 (Str2Num): Only catch ValueError exceptions.
4942
4943 * Thuban/Model/classification.py: Class documentation. Renaming
4944 of methods with Stroke to Line. Groups are stored in a single
4945 list with the default as the first element. Groups are searched
4946 in the order they appear in the list.
4947
4948 * Thuban/Model/color.py: Documentation.
4949
4950 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
4951 the kind of data represented by a field.
4952
4953 * Thuban/Model/load.py (ProcessSession): Use proper string
4954 conversion function; fixes RTbug #1713.
4955
4956 * Thuban/Model/save.py (Saver): Store field type information.
4957
4958 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
4959 (Table): Add field_info_by_name() to retrieve field information
4960 by specifying the field name, not the number.
4961
4962 * Thuban/UI/mainwindow.py: Function name changes.
4963
4964 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4965 get the layer classification once. Don't try to classify
4966 values when the field is None: just use the default properties.
4967
4968 * Thuban/UI/view.py: Function name changes.
4969
4970 * Doc/thuban.dtd: Add field_type attribute to a classification.
4971
4972 2003-03-04 Bernhard Herzog <[email protected]>
4973
4974 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
4975 the fill and stroke layer attributes optional with suitable
4976 default values. Add the stroke_width layer attribute. Use correct
4977 syntax for empty elements. Make the attribute list for labels
4978 refer to the label element.
4979
4980 2003-03-04 Bernhard Herzog <[email protected]>
4981
4982 * setup.py (thuban_build_py.build): Add a comment about distutils in
4983 Python 2.3 containing some of the functionality we implement in
4984 setup.py ourselves.
4985
4986 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
4987 before the selection mode. Doing it the other way round triggers
4988 an assertion in wxWindows.
4989
4990 * Thuban/Model/save.py (escape): Fix typo in doc-string
4991
4992 * Thuban/Model/classification.py: Remove unnecessary wxPython
4993 import
4994
4995 2003-03-04 Jonathan Coles <[email protected]>
4996
4997 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
4998 Parameter 'value' should default to None.
4999
5000 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
5001 the class attribute __classification is now private.
5002
5003 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
5004 Classifier to ClassGrid. Added support for removing selected rows,
5005 which including code for keeping track of when cells are selected,
5006 and deselected.
5007 (ClassTable): Support for added/removing rows. Fixed a problem
5008 with __ParseInput whereby it would not allow strings (only numbers)
5009 to be entered.
5010 (Classifier): Added button and supporting code for removing
5011 selected rows.
5012
5013 2003-02-27 Jonathan Coles <[email protected]>
5014
5015 * Thuban/common.py: Moved color conversion functions into
5016 Thuban/UI/common.py.
5017 (Str2Num): Now converts the float (not the string) to a long/int
5018 so that an exception isn't thrown.
5019
5020 * Thuban/UI/common.py: Common functions used in several UI modules
5021
5022 * Thuban/Model/classification.py: Changed the class hierarchy
5023 so that a Classification consists of Groups which return
5024 Properties when a value matches a Group.
5025
5026 * Thuban/Model/layer.py: Fixed name resolution problem.
5027
5028 * Thuban/Model/load.py: Use new Classification and Group functions.
5029
5030 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
5031 failure.
5032 (Saver.write_classification): Use new Classification and Group
5033 functions.
5034
5035 * Thuban/UI/classifier.py: Changes to use new Classification and Group
5036 functions. Fix to create a tuple with a single value instead of
5037 simply returning the value.
5038
5039 * Thuban/UI/renderer.py: Use new Classification and Group functions.
5040 Use common.py functions.
5041
5042 * Thuban/UI/tree.py: Use common.py functions.
5043
5044 * test/test_classification.py: Use new Classification and Group
5045 classes.
5046
5047 2003-02-24 Jonathan Coles <[email protected]>
5048
5049 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
5050 functions from Thuban color objects to wxWindow colour objects.
5051
5052 * Thuban/Model/classification.py (Classification): Renamed
5053 GetProperties() to GetClassData(). Used the new iterator
5054 in TreeInfo().
5055 (ClassIterator): Iterator implementation to iterate over the
5056 ClassData objects in a classification object.
5057
5058 * Thuban/Model/save.py (Saver.write_classificaton): Uses
5059 the new iterator to save the classification information.
5060
5061 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
5062 for changing the stroke and fill colors and previewing the
5063 changes.
5064
5065 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
5066 MainWindow.SaveSessionAs): Text string changes so the dialogs
5067 have more meaningful titles.
5068
5069 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
5070 Classification method name from GetProperties to GetClassData.
5071
5072 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
5073 instead of accessing now non-existent class variables.
5074
5075 2003-02-24 Bernhard Herzog <[email protected]>
5076
5077 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
5078 unneeded Shape() call. Rendering is substantially faster without
5079 it and it avoids some problems with broken shape files.
5080
5081 2003-02-20 Frank Koormann <[email protected]>
5082
5083 Force minimal size of identify and label dialogs. The autosizing
5084 looked too ugly.
5085
5086 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
5087 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
5088 Set size of listctrl.
5089 * Thuban/UI/identifyview.py (IdentifyView.__init__):
5090 Set size of dialog.
5091
5092 2003-02-19 Jonathan Coles <[email protected]>
5093
5094 * test/test_classification.py, test/test_layer.py,
5095 test/test_load.py, test/test_map.py, test/test_session.py:
5096 Updated the tests to use the new functions that are in the
5097 respective classes.
5098
5099 * Thuban/Model/classification.py (Classification):
5100 Uses the new ClassData* classes. Modification messages are
5101 passed up to the parent layer (if it exists).
5102 (ClassData): New class to encapsulate the common data in each
5103 classification property.
5104 (ClassDataDefault): Represents the Default class. data.
5105 (ClassDataPoint): Represents a single class. data point
5106 (ClassDataRange): Represents a class. range
5107 (ClassDataMap): Represents a class. map (unused).
5108
5109 * Thuban/Model/color.py: Added Color.None to represent something
5110 with no color. Color.Black represents the color black.
5111 (NoColor): Helper class derived from Color to represent something
5112 with no color.
5113
5114 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
5115 stroke_width attributes. Made the 'classification' attribute private.
5116 New methods for setting/getting the classification.
5117
5118 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
5119 to get the classifcation and use the new ClassData* classes to
5120 hold the classification data. Use Str2Num to convert numbers
5121 properly.
5122
5123 * Thuban/Model/save.py (Saver): Use new Color and Classification
5124 methods
5125
5126 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
5127 custom grid.
5128 (ClassTable): Support for editing Values and Labels and for
5129 changing what type (point or range) of data is stored in each
5130 property based on how the user enters the data.
5131 (Classifier): Support for saving the new classifications and
5132 launching the dialog to edit a property.
5133 (SelectPropertiesDialog): New class for editing the visual
5134 properties of a classification (stroke color, width, and fill color)
5135 (ClassPreviewer): Took the Draw method from ClassRenderer and
5136 made most of it into this new class. Intend to use this class in
5137 the SelectPropertiesDialog for previewing changes.
5138
5139 * Thuban/UI/renderer.py: Use new Color and Classification methods.
5140
5141 * Thuban/UI/tree.py: Formatting changes.
5142
5143 * Doc/thuban.dtd: Add 'label' element
5144
5145 * Thuban/common.py: New. Contains common routines used throughout
5146 the code.
5147 (Str2Num): Takes a string and converts it to the "best" type of
5148 number.
5149
5150 2003-02-14 Bernhard Herzog <[email protected]>
5151
5152 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
5153 dragging flag is always set to 0 even when the tool implementation
5154 raises an exception
5155
5156 2003-02-11 Bernhard Herzog <[email protected]>
5157
5158 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
5159 method to create a splash screen.
5160 (ThubanApplication.ShowMainWindow): New. Show the main window.
5161 Needed so the splash screen can display the mainwindow
5162 (ThubanApplication.OnInit): Call the
5163 new splash_screen method to determine whether the application
5164 should display a splash screen. If it displays a splash screen do
5165 not immediately show the main window.
5166
5167 2003-02-11 Jonathan Coles <[email protected]>
5168
5169 * Thuban/Model/classification.py: Added import line to fix
5170 feature conflicts between running on python2.2 and python2.1.
5171
5172 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
5173 onto the clinfo parameter, so removed the deepcopy().
5174
5175 2003-02-10 Jonathan Coles <[email protected]>
5176
5177 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
5178 Added element_open variable to track opening and closing of tags
5179 so that tags that don't span more than one line are closed with
5180 /> instead of </tag_name>. Use the GetDefault*() methods of
5181 the Classification class.
5182
5183 * Thuban/Model/classification.py (Classificaton): Added set and
5184 get methods for the default data. The class also takes a layer
5185 reference so that modification messages can be sent. Fixed the
5186 methods to use the new ClassData class.
5187 (ClassData): New class to encapsulate the classification data
5188
5189 * Thuban/Model/layer.py (Layer): Remove the
5190 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
5191 SetDefault*() methods on the layer's classification object.
5192 (Layer.__init__): Use the new SetDefault*() methods in the
5193 Classification class.
5194
5195 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
5196 object instead of a dictionary.
5197
5198 * Thuban/UI/classifier.py (ClassRenderer): New class to
5199 draw the classifications in the dialog box's table.
5200 (Classifier): Modified to use the ClassRenderer class.
5201
5202 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
5203 methods of the Classification class.
5204
5205 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
5206 of the ClassData class.
5207
5208 * test/test_classification.py, test/test_layer.py,
5209 test/test_map.py, test/test_session.py: Fix the tests to work
5210 with the above code changes.
5211
5212 2003-02-03 Jonathan Coles <[email protected]>
5213
5214 * Thuban/Model/classification.py (Classification): Added getNull()
5215 to return the NullData reference
5216
5217 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
5218 Layer.SetStrokeWidth): Modified these functions to change the
5219 null data in the classification rather than keep these values
5220 directly in the Layer class. Menu options to change these values
5221 work again.
5222
5223 2003-01-28 Jonathan Coles <[email protected]>
5224
5225 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
5226 Fixed crashing problem on some systems. Dialog box shows
5227 classification data.
5228
5229 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
5230 Colors in the tree view.
5231
5232 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
5233 the tree info for classifications. Commented out unnecessary lines.
5234
5235 * Thuban/Model/classification.py (Classification.TreeInfo): New
5236 function to add information about the classification into the
5237 tree view.
5238
5239 2003-01-27 Jan-Oliver Wagner <[email protected]>
5240
5241 * Thuban/__init__.py (_): New.
5242
5243 * Thuban/Model/classification.py, Thuban/Model/extension.py,
5244 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
5245 Thuban/Model/session.py, Thuban/UI/application.py,
5246 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
5247 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
5248 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
5249 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
5250 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
5251
5252 2003-01-27 Jonathan Coles <[email protected]>
5253
5254 * Thuban/Model/layer.py: Classification initialization calls.
5255
5256 * Thuban/Model/classification.py: Created class to encapsulate
5257 a layer classification. Supports specific data points and
5258 ranges.
5259
5260 * Thuban/Model/load.py: Added support for loading classification
5261 information.
5262
5263 * Thuban/Model/save.py: Added support for saving classification
5264 information.
5265
5266 * Thuban/UI/classifier.py: Initial class for a dialog box for
5267 specifying classification information.
5268
5269 * Thuban/UI/mainwindows.py: Support for opening the classifier
5270 dialog.
5271
5272 * Thuban/UI/renderer.py: Support for drawing a layer with the
5273 classification information.
5274
5275 * Data/iceland_sample_class.thuban: iceland_sample with
5276 classification data.
5277
5278 * test/test_classification: Tests for the Classification class.
5279
5280 2002-12-09 Bernhard Herzog <[email protected]>
5281
5282 * test/test_command.py: New. Tests for the command classes.
5283
5284 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
5285 (Command.IsTool): New method to distinguish between command
5286 switching tools and other commands.
5287
5288 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
5289 the tool to avoid direct assignments to instance variables
5290 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
5291 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
5292 change the tool
5293
5294 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
5295 active tool's command turns insensitive, disable the tool.
5296 (_tool_command): Use the new ToolCommand class
5297
5298 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
5299 SelectTool method to change the tool
5300 (iconfile): Use the ToolCommand class
5301
5302 2002-12-03 Bernhard Herzog <[email protected]>
5303
5304 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
5305 the case of selected items that are not children of Layers or Maps
5306 properly. Previously this bug would trigger an assertion in
5307 wxWindows.
5308
5309 2002-11-06 Frank Koormann <[email protected]>
5310
5311 * Thuban/UI/mainwindow.py: Altered the order of tools in the
5312 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
5313 Full Extent).
5314
5315 2002-10-23 Bernhard Herzog <[email protected]>
5316
5317 * setup.py (setup call): version now 0.1.3
5318
5319 * MANIFEST.in: Add the files in test/
5320
5321 * test/README: Add note about tests requiring the iceland data
5322
5323 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
5324 copyright notice.
5325
5326 2002-10-18 Bernhard Herzog <[email protected]>
5327
5328 * test/test_map.py
5329 (TestMapWithContents.test_projected_bounding_box): Use an explicit
5330 epsilon.
5331
5332 * test/support.py (FloatComparisonMixin.assertFloatEqual)
5333 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
5334 message if the assertion fails and don't return the return value
5335 of self.assert_. In assertFloatSeqEqual the return meant that not
5336 all items of the sequence were compared.
5337
5338 2002-09-20 Bernhard Herzog <[email protected]>
5339
5340 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
5341
5342 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
5343
5344 * test/test_map.py (TestMapWithContents.test_tree_info): Create
5345 the string with the bounding box on the fly because of platform
5346 differences in the way %g is handled.
5347
5348 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
5349 DBFfile too because Thuban layers can't yet cope missing DBF
5350 files.
5351
5352 2002-09-20 Bernhard Herzog <[email protected]>
5353
5354 * test/test_menu.py: Use initthuban instead of
5355 add_thuban_dir_to_path to initialize Thuban.
5356
5357 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
5358 Mixin class for float comparisons
5359 (SubscriberMixin): New. Mixin class to test messages sent through
5360 the Connector class
5361
5362 * test/README: Fix a typo and add the -v flag to the command for
5363 individual tests
5364
5365 * test/test_session.py: New. Test cases for Thuban.Model.session
5366
5367 * test/test_proj.py: New. Test cases for Thuban.Model.proj
5368
5369 * test/test_map.py: New. Test cases for Thuban.Model.map
5370
5371 * test/test_layer.py: New. Test cases for Thuban.Model.layer
5372
5373 * test/test_label.py: New. Test cases for Thuban.Model.label
5374
5375 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
5376
5377 * test/test_color.py: New. Test cases for Thuban.Model.color
5378
5379 * test/test_base.py: New. Test cases for Thuban.Model.base
5380
5381 2002-09-13 Bernhard Herzog <[email protected]>
5382
5383 * Thuban/Model/session.py (Session.forwarded_channels): Forward
5384 the CHANGED channel too.
5385
5386 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
5387 CHANGED channel too.
5388 (Map.__init__): Call the Modifiable constructor as well.
5389
5390 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
5391 event if the modified flag changes.
5392 (Modifiable.changed): Tweak the doc-string.
5393
5394 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
5395 (MainWindow.set_position_text): Put the code that puts the text
5396 with the mouse position into the status bar into the new method
5397 set_position_text so that it can overwritten in derived classes.
5398
5399 2002-09-12 Bernhard Herzog <[email protected]>
5400
5401 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
5402 message box on the main window.
5403
5404 2002-09-11 Bernhard Herzog <[email protected]>
5405
5406 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
5407 the 'E' because it's less likely to interfere with other menu
5408 entries.
5409 (MainWindow.build_menu): remove an incorrect comment.
5410
5411 2002-09-10 Bernhard Herzog <[email protected]>
5412
5413 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
5414 (_tool_command): Add sensitive parameter
5415 (_has_visible_map): Sensitivity callback to tools and other
5416 commands that require a visible map. Use it in map_zoom_in_tool,
5417 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
5418 and map_full_extent
5419
5420 2002-09-06 Bernhard Herzog <[email protected]>
5421
5422 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
5423 VIEW_POSITION
5424
5425 2002-09-04 Frank Koormann <[email protected]>
5426
5427 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
5428
5429 2002-09-02 Bernhard Herzog <[email protected]>
5430
5431 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
5432 wxWindows already and our implementation doesn't work correctly
5433 with wxGTK 2.3:
5434 (MapCanvas.__init__): Remove the instance variable
5435 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
5436 be drawin
5437 (MapCanvas.OnIdle): Removed.
5438
5439 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
5440 a parameter to determine the size of the rectangle.
5441 (MapCanvas.find_shape_at): Create the box around the point on a
5442 layer by layer basis and make the size depend on the shape type.
5443 This solves a problem with the selection of point shapes at the
5444 border of the layer's bounding box
5445
5446 2002-08-30 Bernhard Herzog <[email protected]>
5447
5448 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
5449 for the sensitivity of remove layer.
5450 (_can_remove_layer): New. Sensitivity callback for remove layer
5451 (Command layer_remove): Use _can_remove_layer
5452
5453 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
5454 determine whether a given layer can be deleted.
5455
5456 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
5457 (MapCanvas.do_redraw): Get rid of the unused update_region
5458 instance variable
5459
5460 * Thuban/UI/view.py: Add/update some doc-strings.
5461
5462 * test/: new subdirectory with a bunch of unit tests.
5463
5464 * test/README, test/test_table.py, test/test_save.py,
5465 test/test_menu.py, test/test_load.py: Initial set of tests and
5466 brief instructions on how to run them
5467
5468 2002-08-29 Bernhard Herzog <[email protected]>
5469
5470 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
5471 arcs with multiple parts.
5472
5473 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
5474 Handle degenrate rectangles.
5475
5476 * Thuban/Model/table.py: Make writing records work correctly:
5477 (Table.__init__): Keep track of whether the DBF is open for
5478 writing
5479 (Table.write_record): Open the DBF file for writing when necessary
5480
5481 2002-08-27 Bernhard Herzog <[email protected]>
5482
5483 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
5484 dbf files only for reading by default. Use a new writable dbf
5485 object for writing.
5486
5487 2002-08-26 Bernhard Herzog <[email protected]>
5488
5489 * Thuban/UI/mainwindow.py: Refactor the context creation:
5490 (MainWindow.Context): New method to return a context
5491 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
5492 new method
5493
5494 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
5495 layer table specific code from TableGrid into LayerTableGrid
5496 (TableFrame, LayerTableFrame): Split the layer table specific code
5497 from TableFrame into LayerTableFrame
5498 (LayerTableGrid.select_shape): Remove a debug print
5499
5500 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
5501 LayerTableFrame
5502
5503 2002-08-23 Bernhard Herzog <[email protected]>
5504
5505 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
5506 absolute filename.
5507
5508 2002-08-22 Bernhard Herzog <[email protected]>
5509
5510 * Thuban/Model/table.py (Table.write_record): New method to write
5511 records.
5512 (Table.__init__): Open the DBF file for writing too.
5513
5514 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
5515 into the underlying table.
5516
5517 * extensions/shapelib/shapefil.h (DBFCommit),
5518 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
5519 commit any changes made to the DBF file.
5520
5521 * Thuban/UI/mainwindow.py (make_check_current_tool)
5522 (_tool_command): Put the code that generates the "checked"
5523 callback into a separate function so that we can reuse it
5524 elsewhere
5525
5526 * Thuban/Model/save.py (Saver): New class to handle serializing a
5527 session into an XML file. The main reason to introduce a class is
5528 that applications built on Thuban can derive from it so that they
5529 can save additional information in a session file.
5530 (save_session): Delegate almost all the work to the Saver class.
5531 Rename the filename argument to file because it may be a file like
5532 object now.
5533
5534 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
5535 code. Remove the little test code which would be executed when the
5536 module is run as a script which didn't work anymore since it can't
5537 import the other Thuban modules.
5538 (ProcessSession, load_session): Refactor the ProcessSession to
5539 have one method for each element start and end tag so that derived
5540 classes can easily override the processing of individual tags.
5541 Also, always parse with namespaces enabled because applications
5542 built on top of Thuban will likely use namespaces if they extend
5543 the session file format.
5544
5545 2002-08-21 Bernhard Herzog <[email protected]>
5546
5547 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
5548 because thubaninit_contents will do it for us.
5549
5550 2002-08-16 Jan-Oliver Wagner <[email protected]>
5551
5552 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
5553 tree window already open
5554
5555 2002-08-15 Bernhard Herzog <[email protected]>
5556
5557 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
5558 with self.
5559
5560 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
5561 when we have actually captured it.
5562
5563 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
5564 shapefile and destroy the table.
5565
5566 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
5567
5568 2002-08-14 Bernhard Herzog <[email protected]>
5569
5570 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
5571 instance variable columns
5572 (RecordTable.GetTypeName): row and col may be negative in some
5573 cases.
5574
5575 * setup.py (InstallLocal.initialize_options)
5576 (InstallLocal.finalize_options, InstallLocal.user_options): New
5577 option create-init-file to build a thubaninit.py when running
5578 install_local
5579 (InstallLocal.run): Create the thubaninit.py module when requested
5580 (thubaninit_contents): Split the template into several parts and
5581 create a new function thubaninit_contents that creates the
5582 contents of a thubaninit module.
5583 (ThubanInstall.run): Use the new function to create the thubaninit
5584 module.
5585
5586 2002-07-30 Bernhard Herzog <[email protected]>
5587
5588 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
5589 cleanup.
5590 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
5591
5592 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
5593 direct base class' Destroy method.
5594
5595 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
5596 layers.
5597 (Map.Destroy): Destroy the label_layer as well and call the
5598 inherited Desatroymethod first so that no more messages are
5599 issued.
5600 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
5601 message if the stacking order actually has changed. Add
5602 doc-strings.
5603 (Map.BoundingBox): Correct the doc-string.
5604 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
5605 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
5606
5607 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
5608 all labels.
5609
5610 2002-07-29 Bernhard Herzog <[email protected]>
5611
5612 * Thuban/Model/map.py (Map.subscribe_layer_channels)
5613 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
5614 to a layer's channels into separate methods.
5615 (Map.RemoveLayer, Map.AddLayer): Call the new methods
5616 (Map.Destroy): Unsubscribe from a layer's channels before
5617 destroying it.
5618
5619 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
5620 selected_layer parameter to searched_layer which is the layer to
5621 search in.
5622 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
5623 search to that layer. Return the selected layer and shape.
5624
5625 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
5626 typo
5627
5628 2002-07-24 Bernhard Herzog <[email protected]>
5629
5630 * Thuban/UI/application.py (ThubanApplication.create_session):
5631 Extend the doc string.
5632 (ThubanApplication.subscribe_session)
5633 (ThubanApplication.unsubscribe_session): New methods to
5634 subscribe/unsubscribe to/from session channels.
5635 (ThubanApplication.SetSession): Call the new methods here.
5636 (ThubanApplication.maps_changed, ThubanApplication.set_map):
5637 Renamed set_map to maps_changed. Its now a subscriber for
5638 MAPS_CHANGED.
5639
5640 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
5641 x-coordinate in case of simple clicks
5642
5643 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
5644 don't pass it as a parameter
5645
5646 * Thuban/Model/session.py (Session.RemoveMap): New
5647
5648 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
5649 window size into a parameter.
5650
5651 2002-07-23 Bernhard Herzog <[email protected]>
5652
5653 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
5654 just commands.
5655
5656 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
5657 parameter list a bit to allow setting the window title and the
5658 initial message in the status bar. Update the callers.
5659
5660 * Thuban/UI/application.py (ThubanApplication.OnInit)
5661 (ThubanApplication.CreateMainWindow): Put the mainwindow
5662 instantiation into a separate method so that it can be overridden
5663 by a subclass.
5664
5665 2002-07-19 Bernhard Herzog <[email protected]>
5666
5667 * Thuban/Model/session.py: Issue a CHANGED message every time
5668 another changed message is issued to make it easier to get
5669 notified of changes.
5670 (Session): Update the doc string
5671 (Session.forward): Issue changed-events as CHANGED as well.
5672 (Session.changed): Overwrite the inherited version to issue
5673 CHANGED events as well.
5674
5675 * Thuban/UI/tree.py: We can now simply subscribe to the session's
5676 CHANGED channel to be informed of changes.
5677 (SessionTreeCtrl.session_channels): Not needed any longer.
5678 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
5679 Only have to (un)subscribe CHANGED
5680
5681 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
5682
5683 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
5684 for the wxPython locale bug to __init__.py so that it's
5685 automatically executed by anybody using UI code from Thuban.
5686
5687 2002-07-18 Bernhard Herzog <[email protected]>
5688
5689 * Thuban/UI/main.py (main): app no longer needs to be global
5690
5691 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
5692 as parameter and store it in an instance variable
5693 (MainWindow.invoke_command, MainWindow.update_command_ui)
5694 (MainWindow.save_modified_session, MainWindow.NewSession)
5695 (MainWindow.OpenSession, MainWindow.SaveSession)
5696 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
5697 application object.
5698
5699 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
5700 the main window with self.
5701
5702 * Thuban/UI/context.py: New module with the context class
5703
5704 * Thuban/UI/command.py (Command): Update doc string.
5705
5706 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
5707 MainWindow.update_command_ui): Pass an instance of the context
5708 class to the command's methods
5709 (check_current_tool, call_method): Handle the new context
5710 implementation
5711
5712 * Examples/simple_extensions/simple_tool.py (simple_tool,
5713 check_simple_tool): Handle the new context implementation
5714
5715 * Examples/simple_extensions/simple_command.py (simple_command):
5716 Handle the new context implementation. Update the comments about
5717 the context.
5718
5719 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
5720 doc-string
5721 (ThubanApplication.Session): New method to return the session
5722 object
5723
5724 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
5725 interactor's selected_layer may not be a layer of the current
5726 session when the tree is updated while a new session is being set.
5727
5728 2002-07-17 Bernhard Herzog <[email protected]>
5729
5730 * Thuban/UI/tree.py (color_string): Removed. No longer used.
5731 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
5732 update_tree into update_tree and add_items. The tree now uses a
5733 more generic way to display the contents of the tree.
5734 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
5735
5736 * Thuban/Model/layer.py (Layer.TreeInfo),
5737 Thuban/Model/extension.py (Extension.TreeInfo),
5738 Thuban/Model/map.py (Map.TreeInfo),
5739 Thuban/Model/session.py (Session.TreeInfo):
5740 Add TreeInfo methods to implement the new tree view update scheme
5741
5742 2002-07-16 Bernhard Herzog <[email protected]>
5743
5744 * Thuban/UI/application.py: Don't use "import from" for the
5745 MainWindow. It can't always be resolved.
5746 (ThubanApplication.OnInit): change reference to MainWindow
5747 accordingly.
5748
5749 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
5750 completely
5751
5752 2002-07-10 Bernhard Herzog <[email protected]>
5753
5754 * setup.py (create_init_module): New configurable variable whose
5755 default depends on the platform we're running on.
5756 (ThubanInstall.initialize_options): Initialize
5757 self.create_init_module from the global create_init_module
5758 (ThubanInstall.user_options): indictate that the options
5759 create-init-module and init-module-dir have arguments.
5760
5761 * setup.py: In the setup call change the version number to include
5762 cvs.
5763
5764 * MANIFEST.in: Add the files in Examples
5765
5766 2002-07-09 Bernhard Herzog <[email protected]>
5767
5768 * setup.py: In the setup call, use the thuban homepage as the
5769 value of the url parameter.
5770
5771 * Examples: New subdirectory for examples.
5772
5773 * Examples/simple_extensions/simple_tool.xpm,
5774 Examples/simple_extensions/simple_tool.py,
5775 Examples/simple_extensions/simple_command.py,
5776 Examples/simple_extensions/README: Simple examples showing how to
5777 add new commands and tools.
5778
5779 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
5780 bdist_rpm that we also have an install script.
5781 (bdist_inno): Add 2002 to the copyright notice.
5782
5783 * setup.py: Create a file in python's site-packages directory to
5784 make installation of Thuban as a library easier.
5785 (ThubanInstall.user_options): Add two new options,
5786 create-init-module and init-module-dir
5787 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
5788 filenames for installation in the default directories.
5789 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
5790 the inherited methods to capture some filenames before they're
5791 transformed too much by distutils.
5792 (ThubanInstall.run): Create the init module if requested.
5793 (ThubanInstall.thuban_init_filename): New method to return the
5794 full name of the init module.
5795 (ThubanInstall.get_outputs): Append the filename of the init
5796 module.
5797
5798 2002-07-08 Bernhard Herzog <[email protected]>
5799
5800 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
5801 handle the prefix properly which means that the default for the
5802 installation prefix should be /usr for RPMs and /usr/local when
5803 doing a normal source install.
5804 (bdist_rpm_install_script): Script to override the default install
5805 commands in the specfile generated by the bdist_rpm command.
5806 (thuban_bdist_rpm.user_options): Add a prefix option
5807 (thuban_bdist_rpm.initialize_options): Init the prefix option.
5808 Create the script files for the spec files as empty files here
5809 (thuban_bdist_rpm._make_spec_file): Override the inherited method
5810 to fill the script files with content.
5811
5812 * Thuban/Model/save.py (relative_filename): Wrapper around
5813 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
5814 argument. save_session now automatically uses this version,
5815 solving a problem when saving to a relative filename.
5816
5817 * setup.py: In the setup call, make sure that the library
5818 directories are under $prefix/lib not directly under $prefix.
5819
5820 2002-06-20 Jan-Oliver Wagner <[email protected]>
5821
5822 * Thuban/Model/extension.py: new module to handle extension objects.
5823 * Thuban/Model/messages.py: new messages for extensions.
5824 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
5825 Session.AddExtension): new for handling extensions.
5826 Also some other minor changes to round up extension handling.
5827 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
5828 of Extension titles and title and names of its objects.
5829
5830 2002-05-29 Bernhard Herzog <[email protected]>
5831
5832 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
5833 the events for a command.
5834 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
5835 Call bind_command_events to bind the events. add_toolbar_command
5836 can now bind events too so that it's possible to have commands
5837 that are only available through the toolbar.
5838 (MainWindow.init_ids): New instance variable events_bound to keep
5839 track of for which commands events have been bound.
5840
5841 2002-05-28 Bernhard Herzog <[email protected]>
5842
5843 * Thuban/UI/menu.py: New module to build and manage menus.
5844
5845 * Thuban/UI/mainwindow.py: Remove some unused imports.
5846 (MainWindow.__init__, main_menu): move the definition of the main
5847 menu from __init__ to the Menu instance main_menu.
5848 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
5849 build the menu bar and sub-menus from a menu description.
5850
5851 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
5852 startup file
5853 (ThubanApplication.read_startup_files): New method to run
5854 ~/.thuban/thubanstart.py
5855
5856 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
5857 Move the toolbar definition to the Menu instance main_toolbar.
5858 (MainWindow.build_toolbar): New method to build the toolbar
5859 similar to the build_menu methods
5860
5861 2002-05-23 Bernhard Herzog <[email protected]>
5862
5863 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
5864 layer_outline_color. Fix it in the definition of the command too.
5865
5866 * Thuban/UI/command.py (Command): Fix typo in doc string
5867
5868 2002-05-22 Bernhard Herzog <[email protected]>
5869
5870 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
5871 in the docstring
5872
5873 2002-05-15 Bernhard Herzog <[email protected]>
5874
5875 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
5876 when the shapefile is empty.
5877 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
5878 now return None for empty shapefiles. Update doc-strings.
5879
5880 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
5881 the layer's bbox being None.
5882
5883 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
5884 layer's bbox being None.
5885
5886 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
5887 necessary.
5888 (MapCanvas.__init__): New instance variables, last_selected_layer
5889 and last_selected_shape to determine how the selection has
5890 changed.
5891
5892 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
5893 AutoSizeColumns because it will cause a traversal of the entire
5894 table which for large .dbf files will take a very long time.
5895
5896 2002-05-14 Bernhard Herzog <[email protected]>
5897
5898 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
5899 maximum depth for the tree than shapelib does by default.
5900
5901 2002-05-10 Bernhard Herzog <[email protected]>
5902
5903 * setup.py (py_modules): The shptree modules doesn't have a
5904 wrapper, so don't include it in the py_modules
5905
5906 2002-05-08 Bernhard Herzog <[email protected]>
5907
5908 * extensions/shapelib/shptree.c (compare_ints): Make arguments
5909 const void * as in the qsort prototype
5910 (SHPTreeFindLikelyShapes): Remove some unused variables.
5911
5912 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
5913 maintains to redraw the window during a drag.
5914 (MapCanvas.unprojected_rect_around_point): New method to determine
5915 a small region around a point for hit-testing.
5916 (MapCanvas.find_shape_at): Only test the shapes in a small region
5917 around the point.
5918
5919 * setup.py: Increment the version to 0.1.2
5920
5921 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
5922 debug print and set session to None after unsubscribing
5923
5924 2002-05-07 Bernhard Herzog <[email protected]>
5925
5926 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
5927 the file to have a .thuban extension.
5928
5929 * Thuban/UI/tree.py (session_channels): New class constant with
5930 all the session channels to subscribe to to update the tree
5931 (SessionTreeCtrl.session_changed): Remember the session so that we
5932 can unsubscribe properly. Use the new class constant to
5933 unsubscribe from the old session and subscribe to the new one.
5934 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
5935 subscriptions of the SessionTreeCtrl.
5936 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
5937
5938 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
5939 Session Tree" command to the file menu.
5940
5941 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
5942 as update_region to the renderer.
5943
5944 * Thuban/UI/renderer.py
5945 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
5946 update box is now directly a tuple, not a wxRect anymore.
5947
5948 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
5949 prints.
5950
5951 2002-05-07 Bernhard Herzog <[email protected]>
5952
5953 * setup.py: Add the shptree extension module. See
5954 extensions/pyshapelib/ChangeLog for more details.
5955
5956 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
5957 extensions/shapelib/dbfopen.c: Really update to the versions of
5958 shapelib 1.2.9. For some reason it wasn't really done on
5959 2002-04-11.
5960
5961 * extensions/shapelib/shptree.c: Modified version of shptree.c of
5962 shapelib 1.2.9. The only real difference is the use of qsort
5963 instead of a bubble sort implementation
5964
5965 * Thuban/Model/layer.py (Layer.__init__): New instance variable
5966 shapetree to hold the shapelib quadtree for the shapefile
5967 (Layer.open_shapefile): Create the quad tree.
5968 (Layer.ShapesInRegion): New method to return the ids of shapes in
5969 a given region using the quad tree.
5970
5971 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
5972 comment
5973 (draw_polygon_shape): Accept both arcs and polygons.
5974 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
5975 the api.
5976
5977 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
5978 return the shape ids to be rendered in a given layer.
5979 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
5980 ids. Use draw_polygon_shape to draw arc shapes as well.
5981 (ScreenRenderer.RenderMap): New parameter for the rectangle that
5982 has to be updated
5983 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
5984 calling it's ShapesInRegion method.
5985
5986 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5987 update_region for the update region.
5988 (MapCanvas.OnPaint): Maintain the update region
5989 (MapCanvas.do_redraw): Pass the bounding box of the update_region
5990 to the renderer when drawing the bitmap. Reset the update_region.
5991
5992 2002-05-03 Bernhard Herzog <[email protected]>
5993
5994 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
5995 MainWindow.OpenSession): Change the file extension of the session
5996 files to .thuban
5997
5998 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
5999 Move the map channels to be forwarded by the session into the
6000 class constant with forwarded_channels. Also add
6001 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
6002 forwarded_channels
6003
6004 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
6005 typo and some rewording).
6006
6007 2002-05-02 Bernhard Herzog <[email protected]>
6008
6009 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
6010 around to speed up most redraws:
6011 (MapCanvas.__init__): New instance variable bitmap which holds the
6012 bitmap
6013 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
6014 self.bitmap to draw.
6015 (MapCanvas.full_redraw): New method to force a full redraw
6016 including the bitmap
6017 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
6018 make sure the bitmap is redrawn.
6019 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
6020 MapCanvas.shape_selected): Call full_redraw instead of readraw to
6021 make sure the bitmap is redrawn.
6022 (MapCanvas.OnSize): New method to handle size events so that the
6023 bitmap can be redrawn.
6024
6025 2002-04-29 Bernhard Herzog <[email protected]>
6026
6027 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
6028 canvas' VIEW_POSITION event
6029 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
6030 Update the text in the status-bar accordingly.
6031
6032 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
6033 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
6034 called.
6035 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
6036 current_position
6037 (MapCanvas.set_current_position): New method to set
6038 current_position. Issue a VIEW_POSITION event
6039 (MapCanvas.CurrentPosition): New public method to return the value
6040 of current_position. Should be called when the VIEW_POSITION event
6041 is processed.
6042 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
6043 Update the position.
6044 (MapCanvas.OnLeaveWindow): Set the position to None.
6045
6046 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
6047 position in the statusbar
6048
6049 2002-04-26 Frank Koormann <[email protected]>
6050
6051 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
6052
6053 2002-04-24 Frank Koormann <[email protected]>
6054
6055 * Resources/Bitmaps/identify.xpm: shadow added
6056
6057 * Resources/Bitmaps/fullextent.xpm: new
6058
6059 2002-04-22 Jan-Oliver Wagner <[email protected]>
6060
6061 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
6062 box
6063
6064 2002-04-21 Jan-Oliver Wagner <[email protected]>
6065
6066 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
6067
6068 * Thuban/UI/tree.py (update_tree): added added map extent
6069
6070 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
6071 icon; added map_full_extend as tool
6072
6073 2002-04-19 Jan-Oliver Wagner <[email protected]>
6074
6075 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
6076 saving _new_ sessions
6077
6078 * Thuban/Model/session.py (create_empty_session): new session
6079 don't have a filename (set to None)
6080
6081 * Thuban/UI/tree.py (update_tree): added filename and modified flag
6082
6083 * Thuban/Model/load.py (ProcessSession): convert projection
6084 parameters from unicode to regular string
6085
6086 * Data/iceland_sample.session: Added UTM Zone 26 projection.
6087
6088 2002-04-11 Bernhard Herzog <[email protected]>
6089
6090 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
6091 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
6092 1.2.9
6093
6094 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
6095 the pyshapelib directoy into the list of include dirs, so that
6096 pyshapelib_api.h can be found.
6097
6098 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
6099 holds the pyshapelib C-API
6100 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
6101 pyshapelib_api to access the shapelib functions.
6102 (initwxproj): Import the c_api from the shapelib module and
6103 initialize pyshapelib_api.
6104
6105 2002-04-04 Bernhard Herzog <[email protected]>
6106
6107 * setup.py (thuban_bdist_rpm.initialize_options): Use
6108 initialize_options to create the scripts for the rpm.
6109
6110 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
6111
6112 2002-04-03 Bernhard Herzog <[email protected]>
6113
6114 * setup.py: Increment version to 0.1.1
6115
6116 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
6117 Layer" and "Remove Layer" commands from the layer menu to the map
6118 menu
6119
6120 2002-02-15 Bernhard Herzog <[email protected]>
6121
6122 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
6123 argument (python <= 1.5.2 erroneously accepted multiuple
6124 arguments)
6125
6126 2002-02-04 Bernhard Herzog <[email protected]>
6127
6128 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
6129 RecordGrid in the identifyview.
6130 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
6131 IdentifyListCtrl. The grid allows editing of the values.
6132
6133 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
6134 implementing a grid for a single row of a thuban table.
6135
6136 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
6137 layers by default. Easier to use than the previous default of only
6138 searching through the select layer which meant that if no layer
6139 was selected, you couldn't select a shape.
6140
6141 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
6142
6143 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
6144 stroke_width attribute
6145
6146 * Thuban/Model/save.py (save_session): Write the new stroke_width
6147 attribute
6148
6149 * Thuban/Model/load.py (ProcessSession.startElement): Read the
6150 stroke_width attribute
6151
6152 * Thuban/Model/layer.py (Layer.__init__): New parameter and
6153 instance variable stroke_width
6154 (Layer.SetStrokeWidth): Set the stroke_width.
6155
6156 2002-02-01 Bernhard Herzog <[email protected]>
6157
6158 * extensions/thuban/wxproj.cpp (project_points): Fix two
6159 off-by-one errors in the last loop that joins the various parts
6160 together.
6161
6162 2002-01-14 Bernhard Herzog <[email protected]>
6163
6164 * setup.py (data_dist.make_distribution): Fix some typos
6165
6166 2001-09-18 Bernhard Herzog <[email protected]>
6167
6168 * README: Slight tweaking in preparation for the 0.1 release
6169
6170 * setup.cfg: Add section for sdist to create both tgz and zip
6171 archives
6172
6173 * setup.py: increase version number to 0.1
6174 (data_dist): New command class for data distribution
6175
6176 2001-09-14 Bernhard Herzog <[email protected]>
6177
6178 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
6179 Handle the case of no layer (i.e. layer is None) properly.
6180
6181 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
6182 Set the initial selection of the combo boxes to reflect the
6183 projection we're starting with in a way that works on windows,
6184 too.
6185
6186 * Thuban/Lib/connector.py (Connector.print_connections): Print the
6187 puiblisher's ids in hex to make it easier to compare them to the
6188 standard repr of python methods
6189
6190 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
6191 messages
6192
6193 2001-09-13 Bernhard Herzog <[email protected]>
6194
6195 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
6196 deselect the layer if no layer is selected
6197
6198 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
6199 idle time when there actually is something to draw. If there's
6200 nothing to draw simply clear the window
6201 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
6202 (MapCanvas.SetMap): force a redraw in all cases because
6203 FitMapToWindow doesn't always do it.
6204 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
6205 specify the point to move into the center of the window
6206 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
6207 dragged, zoon in/out by a factor of 2
6208 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
6209 index, i.e. reversed drawing order) so that objects appearing to
6210 be in from of others are selected first. This is probably mostly
6211 relevant for point shapes where the symbols used may overlap
6212
6213 * Thuban/Model/session.py (create_empty_session): Unset the
6214 modified bit before returning it
6215
6216 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
6217 create_empty_session session to create the new, empty session.
6218
6219 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
6220 the tool bitmaps.
6221 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
6222 the code that asks whether the session should be saved into the
6223 new method save_modified_session.
6224 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
6225 method to save modified session here too.
6226
6227 2001-09-11 Bernhard Herzog <[email protected]>
6228
6229 * setup.py (InnoIconItem): fix typo
6230
6231 (thuban_bdist_inno.run):
6232 (bdist_inno.run): Move the decision not to create symlinks on
6233 non-nt platforms to thuban_bdist_inno and do it unconditinally
6234 since we never want to create the symlinks here
6235
6236 2001-09-10 Bernhard Herzog <[email protected]>
6237
6238 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
6239 identify view immediately
6240
6241 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
6242 and SelectableRecordListCtrl that implement the code shared by the
6243 identify view and the label dialog
6244
6245 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
6246 new class RecordListCtrl
6247
6248 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
6249 return value of GetValue is None instead of using it as a boolean
6250 directly so that Zero numbers are handled properly.
6251 (LabelListCtrl): Derive from the new class
6252 SelectableRecordListCtrl
6253
6254 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
6255 (Proj4Dialog.dialogLayout): Make the window resizable and set the
6256 size of the text control explicitly to make the sizers work on
6257 both Windows and X.
6258
6259 2001-09-07 Bernhard Herzog <[email protected]>
6260
6261 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
6262 that can limit the search to the currently selected layer.
6263 (MapCanvas.SelectShapeAt): Make sure that the currently selected
6264 layer stays selected even when no shape is found
6265 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
6266 height do nothing (avoids zero division errors)
6267
6268 2001-09-06 Bernhard Herzog <[email protected]>
6269
6270 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
6271 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
6272 convenient :-)
6273 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
6274 a new instvar layer_to_item to map layers to tree items
6275 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
6276 to match the current selection in the interactor
6277
6278 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
6279 (Interactor.HasSelectedLayer): New methods to query the current
6280 selection
6281
6282 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
6283 (MainWindow.has_selected_layer): Simply call the appropriate
6284 interactor method
6285
6286 * Thuban/UI/mainwindow.py (MainWindow.__init__):
6287 (MainWindow.LayerShowTable):
6288 (MainWindow.identify_view_on_demand): Store the interactor in an
6289 instvar and use that reference instead of going through main.app
6290
6291 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
6292 * Thuban/UI/application.py (ThubanApplication.OnInit):
6293 * Thuban/UI/main.py (main): Create the session tree view in main
6294 with the new mainwindow method ShowSessionTree and not directly
6295 the application's OnInit method
6296
6297 * Thuban/UI/tree.py (myTreeCtrlPanel):
6298 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
6299 TreeCtrl isntead of a panel. This affects most method since we now
6300 refer to self instead of self.tree
6301 (SessionTreeView): New class implementing a non-modal dialog
6302 showing the session tree.
6303
6304 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
6305 layer to the tableview dialog.
6306
6307 * Thuban/UI/tableview.py: Add some doc-strings
6308 (TableGrid):
6309 (TableGrid.OnRangeSelect):
6310 (TableGrid.OnSelectCell):
6311 (TableFrame.__init__):
6312 (TableFrame.row_selected):
6313 Selecting rows in the grid view now updates the selected shapes
6314 through the TableFrame. To achieve this we derive TableGrid from
6315 Publisher and introduce the message type ROW_SELECTED which the
6316 TableFrame subscribes to and which is issued by OnRangeSelect and
6317 OnSelectCell
6318
6319 (DataTable.SelectRow): Removed because it's no longer needed in
6320 the row/shape selection scheme
6321
6322 * Thuban/UI/dialogs.py: New file implementing common classes for
6323 dialogs
6324
6325 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
6326 the SELECTED_SHAPE message anymore. This is now handled by the
6327 parent.
6328 (TableGrid.select_shape): Only update the selection if the shape
6329 is not None.
6330 (TableFrame): Inherit from the new NonModalDialog class.
6331 (TableFrame.__init__, TableFrame.select_shape): Handle the
6332 SELECT_SHAPE message.
6333 (TableFrame.OnClose): Extend the inherited method to unsubscribe
6334 SELECT_SHAPE
6335
6336 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
6337 (MainWindow.add_dialog):
6338 (MainWindow.dialog_open):
6339 (MainWindow.remove_dialog):
6340 (MainWindow.get_open_dialog): New methods to maintain a dictionary
6341 of opened non-modal dialogs.
6342
6343 (MainWindow.__init__): Initialize the new non-modal dictionary
6344 management code
6345 (MainWindow.LayerShowTable): maintain separate dialogs for each
6346 table using the non-modal dialog management code to only open a
6347 view once for each table.
6348
6349 (MainWindow.IdentifyTool):
6350 (MainWindow.__init__):
6351 (MainWindow.identify_view_on_demand): Don't open the identify view
6352 in IdentifyTool anymore. This will be done automatically by the
6353 new method identify_view_on_demand which handles the
6354 SELECTED_SHAPE message so that the identify view will be opened on
6355 demand
6356
6357 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
6358 the interactor argument. The SELECTED_SHAPE message is now handled
6359 by the parent.
6360 (IdentifyView.__init__): Add the interactor argument so that we
6361 can handle the SELECTED_SHAPE message here
6362 (IdentifyView.selected_shape): New method to handle the
6363 SELECTED_SHAPE messages
6364
6365 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
6366 NonModalDialog class
6367 (IdentifyView.OnClose): Extend the inherited version to
6368 unsubscribe SELECT_SHAPE
6369
6370 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
6371
6372 2001-09-05 Bernhard Herzog <[email protected]>
6373
6374 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
6375
6376 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
6377 interactor to pass through to the MapCanvas
6378
6379 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
6380 argument to the MainWindow constructor to get rid of the ugly hack
6381 that made main.app available early just so that the mapcanvas
6382 could access the interactor object.
6383
6384 2001-09-04 Bernhard Herzog <[email protected]>
6385
6386 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
6387 that runs a modal message box
6388 (MainWindow.OnClose): Use the new method
6389 (MainWindow.RemoveLayer): Just do nothing in case no layer is
6390 selected. The command should be grayed out anyway, so there's no
6391 need to pop up a message box.
6392 (MainWindow.AddLayer): Pop up a message box with an error message
6393 if the shape file can't be opened
6394
6395 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
6396 immediately. This will cause an exception in case the file can't
6397 be opened and we can display an appropriate message.
6398
6399 * MANIFEST.in: Add extensions/pyprojection/LICENSE
6400
6401 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
6402 specific bdist_rpm command.
6403
6404 * Thuban/UI/main.py: Catch ImportError exceptions when importing
6405 the locale module because it may not be available on some
6406 installations.
6407
6408 * extensions/pyprojection/LICENSE: Copy of the license text in
6409 Projection.i. Having it in a separate file makes it easier to
6410 refer to license text in e.g. RPMs
6411
6412 2001-09-03 Bernhard Herzog <[email protected]>
6413
6414 * setup.py: use wx-config instead of wxgtk-config because it's
6415 more generic
6416
6417 * setup.py (ThubanInstall.get_outputs): Add the symlink in
6418 <prefix>/bin to the outputs
6419 (ThubanInstall.link_file): New method to link files. We need this
6420 because the standard copy_files refuses to link non-existing
6421 files.
6422 (ThubanInstall.run): Remove the leading install root from the
6423 script filename if an install root was specified and use the new
6424 link_file method
6425
6426 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
6427 the window when the first layer is added to the map.
6428
6429 * setup.py (ThubanInstall.run): Honor the build root (self.root)
6430 when linking thuban.py to <prefix>/bin
6431
6432 2001-08-31 Bernhard Herzog <[email protected]>
6433
6434 * setup.py: In the setup call, the install parameters shouldn't
6435 have trailing slashes because distutils on non-posix platforms
6436 doesn't like that. The same applies to other directories like
6437 "Resources/Bitmaps"
6438
6439 In the configuration section for nt, move the wxWindows directory
6440 optins into the part clearly marked as editable.
6441
6442 (InstallLocal.initialize_options):
6443 (InstallLocal.user_options): remove the currently unused debug
6444 flag
6445 (thuban_build_py.find_all_modules): Add this method so that it
6446 works for our case of having packages and modules in one
6447 distribution as well.
6448 (ThubanInstall.initialize_options):
6449 (ThubanInstall.finalize_options):
6450 (ThubanInstall.user_options):
6451 (ThubanInstall.boolean_options): Add new options, do-symlink and
6452 extra files. Since these are the first ThubanInstall specific
6453 options, override user_options and boolean_options
6454 (ThubanInstall.run): Honor the new do-symlink and extra-files
6455 options.
6456 (ThubanInstall.get_outputs): Add to override the base-class's
6457 version and add the extra-files to the outputs
6458 (bdist_inno): New class for windows distributions with Inno Setup
6459 (InnoIconItem): Helper class for bdist_inno
6460 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
6461 this together with the appropriate parameters, to the setup call.
6462
6463 * setup.cfg (bdist_inno): added new section for the inno setup
6464 installer
6465
6466 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
6467 changing_selection to avoid recursive selection events when
6468 modifying the selection in response to a selection event.
6469 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
6470 changing the tree's selection.
6471 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
6472 we're not being called indirectly from normalize_selection.
6473
6474 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
6475 event.Check only if the command is actuall checkable.
6476 (MainWindow.__init__): Call the toolbar's Realize method to make
6477 sure that the items are actually shown
6478
6479 2001-08-28 Bernhard Herzog <[email protected]>
6480
6481 * setup.py: Fix some doc strings
6482
6483 * ChangeLog: started
6484

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26