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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1560 - (show annotations)
Thu Aug 7 17:32:20 2003 UTC (21 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 247487 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26