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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1109 - (show annotations)
Fri May 30 06:31:48 2003 UTC (21 years, 9 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 168209 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26