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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1145 - (show annotations)
Tue Jun 10 11:57:15 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 174964 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26