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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1093 - (show annotations)
Wed May 28 17:10:09 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 165033 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26