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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1248 - (show annotations)
Thu Jun 19 19:53:47 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 193942 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26