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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1127 - (show annotations)
Mon Jun 2 14:16:37 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 170638 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26