/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Contents of /branches/greater-ms3/thuban/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1216 - (show annotations)
Mon Jun 16 14:14:33 2003 UTC (21 years, 8 months ago) by frank
File size: 180947 byte(s)
GREAT-ER ZoomIn Fix

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26