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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26