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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1147 - (show annotations)
Tue Jun 10 12:00:45 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 175323 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26