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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1506 - (show annotations)
Tue Jul 29 14:29:25 2003 UTC (21 years, 7 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 237248 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26