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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1500 - (show annotations)
Tue Jul 29 13:29:46 2003 UTC (21 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 236327 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26