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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1758 - (show annotations)
Fri Sep 26 14:43:56 2003 UTC (21 years, 5 months ago) by frank
File size: 192049 byte(s)
Thuban/UI/renderer.py (ExportRenderer.RenderMap),
Thuban/UI/view.py (MapPrintout.draw_on_dc, MapCanvase.Export):
	Added mainwindow title to export/printout as caption.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26