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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1112 - (show annotations)
Fri May 30 09:55:04 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 168451 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26