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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1083 - (show annotations)
Wed May 28 10:04:30 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 164183 byte(s)
Update wxproj

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26