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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1120 - (show annotations)
Mon Jun 2 10:38:24 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 169625 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26