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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1137 - (show annotations)
Thu Jun 5 15:06:34 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 172610 byte(s)
Projection updates

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26