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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1366 - (show annotations)
Thu Jul 3 13:24:28 2003 UTC (21 years, 8 months ago) by bh
File size: 184043 byte(s)
* Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
Update doc-string
(TransientJoinedTable.create): Do not modify the column objects of
the input tables in place and copy all columns of the input tables
into the joined table after all.

* test/test_transientdb.py
(TestTransientTable.test_transient_joined_table_same_column_name):
Update to reflect the new behavior
(TestTransientTable.test_transient_joined_table_with_equal_column_names):
Update to reflect the new behavior
(TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
New test case for a bug which modified the column objects in place

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26