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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1130 - (show annotations)
Wed Jun 4 18:37:57 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 171496 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26