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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1067 - (show annotations)
Tue May 27 14:18:26 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 160785 byte(s)
Keyboard navigation update

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26