/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Contents of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1087 - (show annotations)
Wed May 28 11:36:24 2003 UTC (21 years, 9 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 164506 byte(s)
small bug-fix

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26