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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1075 - (show annotations)
Tue May 27 17:39:54 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 163292 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26