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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1065 - (show annotations)
Tue May 27 14:10:33 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 160595 byte(s)
Legend display update

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26