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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1114 - (show annotations)
Fri May 30 15:59:58 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 168988 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26