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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1497 - (show annotations)
Tue Jul 29 12:07:41 2003 UTC (21 years, 7 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 236159 byte(s)
gaspell-checked documentation

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26