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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1085 - (show annotations)
Wed May 28 10:25:30 2003 UTC (21 years, 9 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 164350 byte(s)
small GUI improvement

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26