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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 623 - (show annotations)
Mon Apr 7 10:54:54 2003 UTC (21 years, 11 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 83721 byte(s)
update ChangeLog

1 2003-04-07 Bernhard Herzog <[email protected]>
2
3 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
4 favor of ToggleSessionTree
5 (MainWindow.ToggleSessionTree): New method to toggle visibility of
6 the session tree.
7 (MainWindow.SessionTreeShown): New method to return whether the
8 session tree is currently shown.
9 (MainWindow.ToggleLegend): New method to toggle visibility of the
10 legend
11 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
12 LegendShown
13 (MainWindow.LegendShown): New method to return whether the legend
14 is currently shown.
15 (_method_command): Add checked parameter so we can define check
16 menu items
17 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
18 mainwindow methods.
19 (show_session_tree, show_legend commands): Removed.
20 (toggle_session_tree, toggle_legend commands): New commands to
21 toggle the visibility of the dialogs
22
23 2003-04-07 Jonathan Coles <[email protected]>
24
25 * Thuban/UI/classgen.py: Fix Windows problem.
26
27 * Thuban/UI/dock.py: Fix Windows problem.
28
29 * Thuban/UI/mainwindow.py: Use False instead of false.
30 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
31
32 2003-04-07 Jonathan Coles <[email protected]>
33
34 Since we now say that the order of the groups in a classification
35 matters, it makes sense to be able to manipulate that order. Most
36 of the changes to Thuban/Model/classification.py are to that end.
37
38 * Thuban/Model/classification.py (Classification.AppendGroup,
39 Classification.InsertGroup, Classification.ReplaceGroup,
40 Classification.RemoveGroup, Classification.GetGroup): Do as the
41 names imply.
42 (Classification.FindGroup): This was called GetGroup, but GetGroup
43 takes an index, while FindGroup takes a value.
44 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
45 REFERENCE. Currently there is a cyclic reference between the layer
46 and its classification. If the classification doesn't need to know
47 its owning layer we can change this, since it may make sense to be
48 able to use the same classification with different layers.
49
50 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
51
52 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
53 not AddGroup()
54
55 * Thuban/UI/classifier.py: Now that we can depend on the order in
56 a Classification and have methods to manipulate that order we don't
57 need to use our own data structures in the grid. We can simply make
58 the grid/table access the information they need from a copy of
59 the classification object.
60 (Classifier._OnCloseBtn): Event handler for when the user clicks
61 'Close'. This is needed so if the user applies changes and then
62 continues to change the table the user has the option of discarding
63 the most recent changes and keeping what they applied.
64
65 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
66 into the same group.
67
68 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
69 with a really old version of proj, PJ_VERSION won't even be defined.
70 If it isn't defined then just compile so that the function always
71 returns Py_False.
72
73 * test/test_classification.py: Fix tests to use the renamed methods.
74 Still need to write tests for the new methods.
75
76 2003-04-04 Jonathan Coles <[email protected]>
77
78 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
79 call to SetSelection out of the method and before the call
80 to __SelectField in __init__. This prevents a recursion of events
81 when _OnFieldSelect is triggered by the user.
82
83 2003-04-04 Jonathan Coles <[email protected]>
84
85 * Thuban/Model/classification.py: Rename Color.None to
86 Color.Transparent.
87 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
88 Don't bother copying the color, since Colors are immutable.
89
90 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
91 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
92 Thuban/UI/renderer.py, Thuban/UI/view.py:
93 Rename Color.None to Color.Transparent.
94
95 * test/test_classification.py, test/test_load.py: Rename Color.None
96 to Color.Transparent.
97
98 2003-04-04 Jonathan Coles <[email protected]>
99
100 * Thuban/Model/classification.py: Fix assert calls.
101 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
102 Copy the color parameter rather than hold onto a reference.
103
104 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
105 the color object.
106 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
107 are sure there exists only one refernce to Color.None in the system.
108 This allows us to use 'is' rather than the comparision functions.
109
110 * Thuban/Model/save.py: Fix assert calls.
111
112 * Thuban/UI/classifier.py: Fix assert calls.
113 (ClassGrid._OnCellDClick): Call up to the classifier to open the
114 dialog to edit the groups properties.
115 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
116 correctly if a cell is resized.
117 (ClassTable.SetClassification): New. Changes the classification
118 that is in the table.
119 (ClassTable.__SetRow): Allow groups to be prepended.
120 (Classifier): New code for opening the EditProperties and
121 GenerateRanges dialogs.
122 (SelectPropertiesDialog.__GetColor): Only set the color in the
123 color dialog if the current color is not None.
124
125 * Thuban/UI/dock.py: Fix assert calls.
126
127 * Thuban/UI/legend.py: Fix assert calls.
128
129 * Thuban/UI/renderer.py: Fix assert calls.
130
131 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
132 classifications.
133 (GenRangePanel): Panel specific to range generation.
134 (GenSingletonPanel): Panel specific to singleton generation.
135 (ClassGenerator): Class responsible for actually generating
136 the classification from the data gathered in the dialog box.
137 (PropertyRamp): Generates properties whose values range from
138 a starting property to an ending property.
139
140 2003-04-03 Bernhard Herzog <[email protected]>
141
142 * test/support.py (print_garbage_information): New function that
143 prints information about still connected messages and memory
144 leaks.
145 (run_suite): Removed.
146 (run_tests): New function for use as a replacement of
147 unittest.main in the test_* files. This one calls
148 print_garbage_information at the end.
149
150 * test/runtests.py (main): Use support.print_garbage_information
151
152 * test/test_layer.py: Use support.run_tests instead of
153 unittest.main so we get memory leak information
154 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
155 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
156 (TestLayerLegend.test_visibility): Call the layer's Destroy method
157 to fix a memory leak.
158
159 * test/test_classification.py: Use support.run_tests instead of
160 unittest.main so we get memory leak information
161 (TestClassification.test_classification): Call the layer's Destroy
162 method to fix a memory leak.
163
164 2003-04-02 Bernhard Herzog <[email protected]>
165
166 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
167 Handle the reference counts of the return value and errors in
168 PyArg_ParseTuple correctly.
169
170 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
171 sure the filename is absolute to avoid problems when saving the
172 session again
173
174 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
175
176 2003-04-01 Jonathan Coles <[email protected]>
177
178 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
179 that there actually are points in the returned list of points
180 before trying to index into the list. The list may be empty if
181 the shape is a Null Shape.
182
183 2003-04-01 Bernhard Herzog <[email protected]>
184
185 * test/test_map.py: Don't use from <module> import *
186
187 2003-04-01 Jonathan Coles <[email protected]>
188
189 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
190 LAYER_LEGEND_CHANGED
191
192 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
193 self.Destroy() to close the window after yesterday's changes.
194
195 * test/test_map.py, test/test_session.py: Fix messages that
196 are sent from maps and layers.
197
198 2003-03-31 Jonathan Coles <[email protected]>
199
200 * Thuban/UI/classifier.py: Commented out some debugging statements.
201 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
202 RTbug #1769.
203
204 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
205 position (although position doesn't work yet under GTK).
206 (DockableWindow.Destroy): New. Called when the window must be
207 closed. Namely needed when the DockFrame closes and must close
208 its children.
209 (DockFrame): Listen for EVT_CLOSE and destroy all children.
210
211 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
212 when then window is told to close.
213 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
214 comment in source for more info.
215
216 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
217
218 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
219 symmetry with other such methods.
220 (MainWindow.ShowLegend): Show the legend docked by default.
221
222 2003-03-28 Jonathan Coles <[email protected]>
223
224 * Thuban/UI/classifier.py: Support for highlighting a specific
225 group within the grid when the classification dialog is opened.
226 Also contains a lot of debugging printouts which will later
227 be removed.
228
229 * Thuban/UI/dock.py: Complete rework on the dock code so that
230 that it is fairly removed from the rest of the Thuban application.
231 It is easy to add new docks which the rest of the program having
232 to be aware of them.
233
234 * Thuban/UI/legend.py: Modifications to support selecting a
235 specific group in the classification dialog. Changed how layers
236 are drawn when the layer is visible/invisible.
237
238 * Thuban/UI/mainwindow.py: Removed legend specific code and
239 replaced it with calls to the new dock code.
240
241 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
242 to check if scale > 0. Trying to track down a divide by zero.
243
244 2003-03-26 Jonathan Coles <[email protected]>
245
246 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
247 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
248 now part of DockableWindow.
249 (LegendPanel.DoOnSelChanged): Select the current layer in the
250 map.
251 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
252 with the selected layer and/or group.
253
254 2003-03-26 Jonathan Coles <[email protected]>
255
256 This putback contains the code for dockable windows. There is
257 no support in wxWindows as of this date for windows that can
258 attach themselves to other windows.
259
260 The current model contains a DockableWindow which has a parent
261 window for when it is detached and a dock window that it puts
262 its contents in when it is docked. The contents of a DockableWindow
263 must be a DockPanel. DockPanel itself derives from wxPanel.
264
265 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
266 message, not a LAYER_LEGEND_CHANGED message.
267
268 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
269
270 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
271 as one of the style properties for the fieldTypeText item to
272 be sure that its size is correct when the text changes.
273
274 * Thuban/UI/dock.py: New. Classes for the DockPanel and
275 DockableWindow.
276
277 * Thuban/UI/legend.py: Added some more buttons and made the
278 LegendPanel a DockPanel.
279
280 * Thuban/UI/mainwindow.py: Added sash windows to the main window
281 and supporting functions for manipulating the sashes.
282 (MainWindow.ShowLegend): Create a DockableWindow with the
283 LegendPanel as the contents.
284
285 * Thuban/UI/messages.py: Added DOCKABLE_* messages
286
287 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
288 not LAYER_LEGEND_CHANGED, messages.
289
290 2003-03-25 Jonathan Coles <[email protected]>
291
292 * setup.py: Added custom script bdist_rpm_build_script so that
293 when the rpm is built the path to wx-config is correct.
294
295 * setup.cfg: Added line saying to use the custom build script
296
297 2003-03-20 Jonathan Coles <[email protected]>
298
299 Initial implementation of the Legend.
300
301 * Thuban/UI/legend.py: New. Creates a window that shows the map's
302 Legend information and allows the user to add/modify classifications
303 and how the layers are drawn on the map.
304
305 * setup.py: New command 'build_docs' which currently uses
306 happydoc to generate html documentation for Thuban.
307
308 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
309 Returns a string which is appropriately describes the group.
310
311 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
312 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
313
314 * Thuban/Model/map.py (Map): Rename messages and use new, more
315 specific, messages.
316
317 * Thuban/Model/messages.py: New message to indicate that a layer's
318 data has changed (LAYER_CHANGED). New map messages to indicate
319 when layers have been added/removed/changed or if the stacking order
320 of the layers has changed.
321
322 * Thuban/Model/session.py: Rename and use new messages.
323
324 * Thuban/UI/classifier.py: Remember if any changes have actually
325 been applied so that if the dialog is cancelled without an application
326 of changes we don't have to set a new classification.
327 (ClassDataPreviewer): Pulled out the window specific code and put it
328 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
329 symbols on any DC.
330
331 * Thuban/UI/mainwindow.py: New code to open the legend.
332
333 * Thuban/UI/view.py: Use new message names.
334
335 2003-03-19 Jonathan Coles <[email protected]>
336
337 * Thuban/UI/main.py (verify_versions): New. Checks the versions
338 of Python, wxPython, and some other libraries.
339
340 * extensions/thuban/wxproj.cpp (check_version): Checks the given
341 version against what wxproj was compiled with.
342 (check_version_gtk): If wxproj was compiled with gtk then check
343 the given version against the version of the gtk library
344 currently being used.
345
346 2003-03-14 Bernhard Herzog <[email protected]>
347
348 * test/test_command.py: Run the tests when the module is run as a
349 script
350
351 2003-03-14 Bernhard Herzog <[email protected]>
352
353 Implement selection of multiple selected shapes in the same layer:
354
355 - Introduce a new class to hold the selection. This basically
356 replaces the interactor which was nothing more than the
357 selection anyway. A major difference is of course that the new
358 selection class supports multiple selected shapes in one layer
359
360 - Move the object that represents the selection from the
361 application to the canvas. The canvas is a better place than the
362 application because the selection represents which shapes and
363 layer of the map displayed by the canvas are selected and
364 affects how the map is drawn.
365
366 - Make the selection and its messages publicly available through
367 the mainwindow.
368
369 - The non-modal dialogs do not get a reference to the interactor
370 anymore as they can simply refer to their parent, the
371 mainwindow, for the what the interactor had to offer.
372
373 * Thuban/UI/selection.py: New module with a class to represent the
374 selection.
375
376 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
377 these unused messages
378
379 * Thuban/UI/application.py (ThubanApplication.OnInit)
380 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
381 interactor is gone now.
382 (ThubanApplication.CreateMainWindow): There is no interactor
383 anymore so we pass None as the interactor argument for now for
384 compatibility.
385
386 * Thuban/UI/view.py (MapCanvas.delegated_messages)
387 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
388 Unsubscribe, delegate messages according to the delegated_messages
389 class variable.
390 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
391 attributes from instance variables as described with the
392 delegated_methods class variable.
393 (MapCanvas.__init__): New instance variable selection holding the
394 current selection
395 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
396 pass them on to the renderer
397 (MapCanvas.SetMap): Clear the selection when a different map is
398 selected.
399 (MapCanvas.shape_selected): Simple force a complete redraw. The
400 selection class now takes care of only issueing SHAPES_SELECTED
401 messages when the set of selected shapes actually does change.
402 (MapCanvas.SelectShapeAt): The selection is now managed in
403 self.selection
404
405 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
406 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
407 Unsubscribe, delegate messages according to the delegated_messages
408 class variable.
409 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
410 attributes from instance variables as described with the
411 delegated_methods class variable.
412 (MainWindow.__init__): The interactor as ivar is gone. The
413 parameter is still there for compatibility. The selection messages
414 now come from the canvas.
415 (MainWindow.current_layer, MainWindow.has_selected_layer):
416 Delegate to the the canvas.
417 (MainWindow.LayerShowTable, MainWindow.Classify)
418 (MainWindow.identify_view_on_demand): The dialogs don't need the
419 interactor parameter anymore.
420
421 * Thuban/UI/tableview.py (TableFrame.__init__)
422 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
423 (LayerTableFrame.row_selected): The interactor is gone. It's job
424 from the dialog's point of view is now done by the mainwindow,
425 i.e. the parent. Subscribe to SHAPES_SELECTED instead
426 of SELECTED_SHAPE
427
428 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
429 is gone. It's job from the dialog's point of view is now done by
430 the mainwindow, i.e. the parent.
431
432 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
433 gone. It's job from the dialog's point of view is now done by the
434 mainwindow, i.e. the parent.
435
436 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
437 gone. It's job from the dialog's point of view is now done by the
438 mainwindow, i.e. the parent.
439 (SessionTreeCtrl.__init__): New parameter mainwindow which is
440 stored as self.mainwindow. The mainwindow is need so that the tree
441 can still subscribe to the selection messages.
442 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
443 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
444 selection is now accessible through the mainwindow. Subscribe to
445 SHAPES_SELECTED instead of SELECTED_SHAPE
446
447 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
448 SHAPES_SELECTED message now.
449 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
450 so deal with multiple shapes
451 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
452 gone. It's job from the dialog's point of view is now done by the
453 mainwindow, i.e. the parent.
454
455 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
456 parameter is now a list of shape ids.
457 (RecordTable.SetTable): The second parameter is now a list of
458 indices.
459
460 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
461 selected_shape parameter and ivar to selected_shapes. It's now a
462 list of shape ids.
463 (MapRenderer.draw_label_layer): Deal with multiple selected
464 shapes. Rearrange the code a bit so that the setup and shape type
465 distinctions are only executed once.
466
467 * test/test_selection.py: Test cases for the selection class
468
469 2003-03-11 Jonathan Coles <[email protected]>
470
471 * Thuban/Model/load.py: Temporary fix so that the xml reader
472 doesn't cause Thuban to crash.
473
474 * Thuban/Model/layer.py: Handle the cyclic references between
475 a layer and its classification better, and be sure to disconnect
476 the classification from the layer when the layer is destroyed
477 so that we don't maintain a cyclic reference that may not be
478 garbage collected.
479
480 * Thuban/Model/classification.py: See comment for layer.py.
481
482 2003-03-12 Jan-Oliver Wagner <[email protected]>
483
484 * HOWTO-Release: New. Information on the steps for releasing
485 a new version of Thuban.
486
487 2003-03-11 Jonathan Coles <[email protected]>
488
489 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
490 Use True instead of true.
491 (Classifier): Should have a single panel in which all the controls lie.
492
493 * Thuban/UI/proj4dialog.py: Add normal border.
494
495 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
496
497 * Thuban/UI/mainwindow.py: Use True instead of true.
498
499 * setup.py: Update some definitions to use wxWindows2.4 files
500
501 * Data/iceland_sample_class.thuban: Fixed file so that the
502 field_type information is present.
503
504 2003-03-10 Jonathan Coles <[email protected]>
505
506 * Thuban/UI/classifier.py (Classifier.__init__): Make the
507 field type label grow so that when the text changes the
508 size is updated correctly. This may be a wxWindows bug.
509
510 2003-03-10 Jonathan Coles <[email protected]>
511
512 * Thuban/UI/application.py: Changed SESSION_CHANGED to
513 SESSION_REPLACED.
514
515 * Thuban/UI/classifier.py: Wrap text with _().
516 (ClassGrid.CreateTable): Set dimensions and size hints here,
517 instead of in Reset, so we only set the size once.
518
519 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
520
521 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
522 Call Close() instead of Shutdown().
523
524 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
525
526 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
527 Go back to using OnClose() instead of Shutdown().
528
529 2003-03-10 Jonathan Coles <[email protected]>
530
531 * Thuban/UI/classifier.py (Classifier): SelectField() needed
532 to know the old field index as well as the new one.
533
534 2003-03-10 Jonathan Coles <[email protected]>
535
536 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
537 to correctly set the table information and call this from
538 __init__ and from _OnFieldSelect so that all the information
539 is up to date when the dialog opens and when a field is changed.
540
541 2003-03-10 Jonathan Coles <[email protected]>
542
543 * Thuban/Model/classification.py (Classification): Don't use
544 layer's message function directly, use the ClassChanged() method
545 when then classification changes. SetField/SetFieldType/SetLayer
546 must keep the information about field name and field type in
547 sync when an owning layer is set or removed.
548
549 * Thuban/Model/layer.py: Added ClassChanged() so that the
550 classification can tell the layer when its data has changed.
551 (Layer.SetClassification): Accepts None as an arguement to
552 remove the current classification and correctly handles
553 adding a new classification.
554
555 * Thuban/Model/load.py: Comment out print statement
556
557 * test/test_classification.py, test/test_save.py: New and
558 improved tests.
559
560 2003-03-07 Jonathan Coles <[email protected]>
561
562 * Thuban/Model/classification.py: Implemented __copy__ and
563 __deepcopy__ for ClassGroup* and ClassGroupProperites so
564 they can easily be copied by the classifier dialog.
565 (ClassGroupProperites.__init__): The default line color should
566 have been Color.Black.
567
568 * Thuban/UI/classifier.py: Setting and Getting table values now
569 uses a consistent set of functions.
570 (Classifier): Now non-modal. Has field type label which changes
571 as the field changes. Keep track of buttons in a list so that
572 we can enable/disable the buttons when the None field is selected.
573 (SelectPropertiesDialog): Add buttons to make the colors transparent.
574
575 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
576 does what OnClose did, but can be called by the application to
577 close a window. Needed when a session changes, and we have to
578 close the classifier windows.
579
580 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
581 Shuts down open dialogs. Used when a new session is created
582 or a session is opened.
583 (MainWindow.SaveSession): Should only call application.SaveSession()
584 if we don't call SaveSessionAs first.
585 (MainWindow.Classify): Allow different classifier dialogs for
586 different layers.
587
588 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
589 the parent class handle it. Add Shutdown() to unsubscibe from
590 event notification and call the parent Shutdown(). This was
591 necessary so the application can close the tree window.
592
593 2003-03-06 Jonathan Coles <[email protected]>
594
595 * Thuban/Model/classification.py: Minor documentation changes,
596 Addition of __eq__ and __ne__ methods.
597 (Classification.SetLayer): prevent recursion between this method
598 and Layer.SetClassification().
599
600 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
601
602 * Thuban/Model/layer.py (SetClassification): prevent recursion
603 between this method and Classification.SetLayer().
604
605 * test/test_classification.py, test/test_load.py,
606 test/test_session.py: Fixed and added tests for the classification
607 classes.
608
609 2003-03-06 Bernhard Herzog <[email protected]>
610
611 * Thuban/UI/classifier.py (ClassGrid.__init__)
612 (ClassGrid.CreateTable): Move the SetSelectionMode call to
613 CreateTable because otherwise it triggers an assertion in
614 wxPython/wxGTK 2.4.
615
616 2003-03-05 Jonathan Coles <[email protected]>
617
618 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
619
620 * Thuban/Model/load.py: import FIELDTYPE constants from table.
621
622 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
623
624 * Thuban/Model/table.py: Put FIELDTYPE constants back.
625
626 2003-03-05 Jonathan Coles <[email protected]>
627
628 * Thuban/UI/classifier.py: Added class documentation.
629 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
630 Store just the groups in the table and generate the other
631 column information when it is requested. Add "None" field
632 to pull-down to select no classification.
633
634 * Thuban/common.py: Moved FIELDTYPE constants from table.py
635 (Str2Num): Only catch ValueError exceptions.
636
637 * Thuban/Model/classification.py: Class documentation. Renaming
638 of methods with Stroke to Line. Groups are stored in a single
639 list with the default as the first element. Groups are searched
640 in the order they appear in the list.
641
642 * Thuban/Model/color.py: Documentation.
643
644 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
645 the kind of data represented by a field.
646
647 * Thuban/Model/load.py (ProcessSession): Use proper string
648 conversion function; fixes RTbug #1713.
649
650 * Thuban/Model/save.py (Saver): Store field type information.
651
652 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
653 (Table): Add field_info_by_name() to retrieve field information
654 by specifying the field name, not the number.
655
656 * Thuban/UI/mainwindow.py: Function name changes.
657
658 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
659 get the layer classification once. Don't try to classify
660 values when the field is None: just use the default properties.
661
662 * Thuban/UI/view.py: Function name changes.
663
664 * Doc/thuban.dtd: Add field_type attribute to a classification.
665
666 2003-03-04 Bernhard Herzog <[email protected]>
667
668 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
669 the fill and stroke layer attributes optional with suitable
670 default values. Add the stroke_width layer attribute. Use correct
671 syntax for empty elements. Make the attribute list for labels
672 refer to the label element.
673
674 2003-03-04 Bernhard Herzog <[email protected]>
675
676 * setup.py (thuban_build_py.build): Add a comment about distutils in
677 Python 2.3 containing some of the functionality we implement in
678 setup.py ourselves.
679
680 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
681 before the selection mode. Doing it the other way round triggers
682 an assertion in wxWindows.
683
684 * Thuban/Model/save.py (escape): Fix typo in doc-string
685
686 * Thuban/Model/classification.py: Remove unnecessary wxPython
687 import
688
689 2003-03-04 Jonathan Coles <[email protected]>
690
691 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
692 Parameter 'value' should default to None.
693
694 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
695 the class attribute __classification is now private.
696
697 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
698 Classifier to ClassGrid. Added support for removing selected rows,
699 which including code for keeping track of when cells are selected,
700 and deselected.
701 (ClassTable): Support for added/removing rows. Fixed a problem
702 with __ParseInput whereby it would not allow strings (only numbers)
703 to be entered.
704 (Classifier): Added button and supporting code for removing
705 selected rows.
706
707 2003-02-27 Jonathan Coles <[email protected]>
708
709 * Thuban/common.py: Moved color conversion functions into
710 Thuban/UI/common.py.
711 (Str2Num): Now converts the float (not the string) to a long/int
712 so that an exception isn't thrown.
713
714 * Thuban/UI/common.py: Common functions used in several UI modules
715
716 * Thuban/Model/classification.py: Changed the class hierarchy
717 so that a Classification consists of Groups which return
718 Properties when a value matches a Group.
719
720 * Thuban/Model/layer.py: Fixed name resolution problem.
721
722 * Thuban/Model/load.py: Use new Classification and Group functions.
723
724 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
725 failure.
726 (Saver.write_classification): Use new Classification and Group
727 functions.
728
729 * Thuban/UI/classifier.py: Changes to use new Classification and Group
730 functions. Fix to create a tuple with a single value instead of
731 simply returning the value.
732
733 * Thuban/UI/renderer.py: Use new Classification and Group functions.
734 Use common.py functions.
735
736 * Thuban/UI/tree.py: Use common.py functions.
737
738 * test/test_classification.py: Use new Classification and Group
739 classes.
740
741 2003-02-24 Jonathan Coles <[email protected]>
742
743 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
744 functions from Thuban color objects to wxWindow colour objects.
745
746 * Thuban/Model/classification.py (Classification): Renamed
747 GetProperties() to GetClassData(). Used the new iterator
748 in TreeInfo().
749 (ClassIterator): Iterator implementation to iterate over the
750 ClassData objects in a classification object.
751
752 * Thuban/Model/save.py (Saver.write_classificaton): Uses
753 the new iterator to save the classification information.
754
755 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
756 for changing the stroke and fill colors and previewing the
757 changes.
758
759 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
760 MainWindow.SaveSessionAs): Text string changes so the dialogs
761 have more meaningful titles.
762
763 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
764 Classification method name from GetProperties to GetClassData.
765
766 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
767 instead of accessing now non-existent class variables.
768
769 2003-02-24 Bernhard Herzog <[email protected]>
770
771 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
772 unneeded Shape() call. Rendering is substantially faster without
773 it and it avoids some problems with broken shape files.
774
775 2003-02-20 Frank Koormann <[email protected]>
776
777 Force minimal size of identify and label dialogs. The autosizing
778 looked too ugly.
779
780 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
781 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
782 Set size of listctrl.
783 * Thuban/UI/identifyview.py (IdentifyView.__init__):
784 Set size of dialog.
785
786 2003-02-19 Jonathan Coles <[email protected]>
787
788 * test/test_classification.py, test/test_layer.py,
789 test/test_load.py, test/test_map.py, test/test_session.py:
790 Updated the tests to use the new functions that are in the
791 respective classes.
792
793 * Thuban/Model/classification.py (Classification):
794 Uses the new ClassData* classes. Modification messages are
795 passed up to the parent layer (if it exists).
796 (ClassData): New class to encapsulate the common data in each
797 classification property.
798 (ClassDataDefault): Represents the Default class. data.
799 (ClassDataPoint): Represents a single class. data point
800 (ClassDataRange): Represents a class. range
801 (ClassDataMap): Represents a class. map (unused).
802
803 * Thuban/Model/color.py: Added Color.None to represent something
804 with no color. Color.Black represents the color black.
805 (NoColor): Helper class derived from Color to represent something
806 with no color.
807
808 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
809 stroke_width attributes. Made the 'classification' attribute private.
810 New methods for setting/getting the classification.
811
812 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
813 to get the classifcation and use the new ClassData* classes to
814 hold the classification data. Use Str2Num to convert numbers
815 properly.
816
817 * Thuban/Model/save.py (Saver): Use new Color and Classification
818 methods
819
820 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
821 custom grid.
822 (ClassTable): Support for editing Values and Labels and for
823 changing what type (point or range) of data is stored in each
824 property based on how the user enters the data.
825 (Classifier): Support for saving the new classifications and
826 launching the dialog to edit a property.
827 (SelectPropertiesDialog): New class for editing the visual
828 properties of a classification (stroke color, width, and fill color)
829 (ClassPreviewer): Took the Draw method from ClassRenderer and
830 made most of it into this new class. Intend to use this class in
831 the SelectPropertiesDialog for previewing changes.
832
833 * Thuban/UI/renderer.py: Use new Color and Classification methods.
834
835 * Thuban/UI/tree.py: Formatting changes.
836
837 * Doc/thuban.dtd: Add 'label' element
838
839 * Thuban/common.py: New. Contains common routines used throughout
840 the code.
841 (Str2Num): Takes a string and converts it to the "best" type of
842 number.
843
844 2003-02-14 Bernhard Herzog <[email protected]>
845
846 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
847 dragging flag is always set to 0 even when the tool implementation
848 raises an exception
849
850 2003-02-11 Bernhard Herzog <[email protected]>
851
852 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
853 method to create a splash screen.
854 (ThubanApplication.ShowMainWindow): New. Show the main window.
855 Needed so the splash screen can display the mainwindow
856 (ThubanApplication.OnInit): Call the
857 new splash_screen method to determine whether the application
858 should display a splash screen. If it displays a splash screen do
859 not immediately show the main window.
860
861 2003-02-11 Jonathan Coles <[email protected]>
862
863 * Thuban/Model/classification.py: Added import line to fix
864 feature conflicts between running on python2.2 and python2.1.
865
866 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
867 onto the clinfo parameter, so removed the deepcopy().
868
869 2003-02-10 Jonathan Coles <[email protected]>
870
871 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
872 Added element_open variable to track opening and closing of tags
873 so that tags that don't span more than one line are closed with
874 /> instead of </tag_name>. Use the GetDefault*() methods of
875 the Classification class.
876
877 * Thuban/Model/classification.py (Classificaton): Added set and
878 get methods for the default data. The class also takes a layer
879 reference so that modification messages can be sent. Fixed the
880 methods to use the new ClassData class.
881 (ClassData): New class to encapsulate the classification data
882
883 * Thuban/Model/layer.py (Layer): Remove the
884 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
885 SetDefault*() methods on the layer's classification object.
886 (Layer.__init__): Use the new SetDefault*() methods in the
887 Classification class.
888
889 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
890 object instead of a dictionary.
891
892 * Thuban/UI/classifier.py (ClassRenderer): New class to
893 draw the classifications in the dialog box's table.
894 (Classifier): Modified to use the ClassRenderer class.
895
896 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
897 methods of the Classification class.
898
899 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
900 of the ClassData class.
901
902 * test/test_classification.py, test/test_layer.py,
903 test/test_map.py, test/test_session.py: Fix the tests to work
904 with the above code changes.
905
906 2003-02-03 Jonathan Coles <[email protected]>
907
908 * Thuban/Model/classification.py (Classification): Added getNull()
909 to return the NullData reference
910
911 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
912 Layer.SetStrokeWidth): Modified these functions to change the
913 null data in the classification rather than keep these values
914 directly in the Layer class. Menu options to change these values
915 work again.
916
917 2003-01-28 Jonathan Coles <[email protected]>
918
919 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
920 Fixed crashing problem on some systems. Dialog box shows
921 classification data.
922
923 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
924 Colors in the tree view.
925
926 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
927 the tree info for classifications. Commented out unnecessary lines.
928
929 * Thuban/Model/classification.py (Classification.TreeInfo): New
930 function to add information about the classification into the
931 tree view.
932
933 2003-01-27 Jan-Oliver Wagner <[email protected]>
934
935 * Thuban/__init__.py (_): New.
936
937 * Thuban/Model/classification.py, Thuban/Model/extension.py,
938 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
939 Thuban/Model/session.py, Thuban/UI/application.py,
940 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
941 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
942 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
943 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
944 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
945
946 2003-01-27 Jonathan Coles <[email protected]>
947
948 * Thuban/Model/layer.py: Classification initialization calls.
949
950 * Thuban/Model/classification.py: Created class to encapsulate
951 a layer classification. Supports specific data points and
952 ranges.
953
954 * Thuban/Model/load.py: Added support for loading classification
955 information.
956
957 * Thuban/Model/save.py: Added support for saving classification
958 information.
959
960 * Thuban/UI/classifier.py: Initial class for a dialog box for
961 specifying classification information.
962
963 * Thuban/UI/mainwindows.py: Support for opening the classifier
964 dialog.
965
966 * Thuban/UI/renderer.py: Support for drawing a layer with the
967 classification information.
968
969 * Data/iceland_sample_class.thuban: iceland_sample with
970 classification data.
971
972 * test/test_classification: Tests for the Classification class.
973
974 2002-12-09 Bernhard Herzog <[email protected]>
975
976 * test/test_command.py: New. Tests for the command classes.
977
978 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
979 (Command.IsTool): New method to distinguish between command
980 switching tools and other commands.
981
982 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
983 the tool to avoid direct assignments to instance variables
984 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
985 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
986 change the tool
987
988 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
989 active tool's command turns insensitive, disable the tool.
990 (_tool_command): Use the new ToolCommand class
991
992 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
993 SelectTool method to change the tool
994 (iconfile): Use the ToolCommand class
995
996 2002-12-03 Bernhard Herzog <[email protected]>
997
998 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
999 the case of selected items that are not children of Layers or Maps
1000 properly. Previously this bug would trigger an assertion in
1001 wxWindows.
1002
1003 2002-11-06 Frank Koormann <[email protected]>
1004
1005 * Thuban/UI/mainwindow.py: Altered the order of tools in the
1006 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
1007 Full Extent).
1008
1009 2002-10-23 Bernhard Herzog <[email protected]>
1010
1011 * setup.py (setup call): version now 0.1.3
1012
1013 * MANIFEST.in: Add the files in test/
1014
1015 * test/README: Add note about tests requiring the iceland data
1016
1017 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
1018 copyright notice.
1019
1020 2002-10-18 Bernhard Herzog <[email protected]>
1021
1022 * test/test_map.py
1023 (TestMapWithContents.test_projected_bounding_box): Use an explicit
1024 epsilon.
1025
1026 * test/support.py (FloatComparisonMixin.assertFloatEqual)
1027 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
1028 message if the assertion fails and don't return the return value
1029 of self.assert_. In assertFloatSeqEqual the return meant that not
1030 all items of the sequence were compared.
1031
1032 2002-09-20 Bernhard Herzog <[email protected]>
1033
1034 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
1035
1036 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
1037
1038 * test/test_map.py (TestMapWithContents.test_tree_info): Create
1039 the string with the bounding box on the fly because of platform
1040 differences in the way %g is handled.
1041
1042 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
1043 DBFfile too because Thuban layers can't yet cope missing DBF
1044 files.
1045
1046 2002-09-20 Bernhard Herzog <[email protected]>
1047
1048 * test/test_menu.py: Use initthuban instead of
1049 add_thuban_dir_to_path to initialize Thuban.
1050
1051 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
1052 Mixin class for float comparisons
1053 (SubscriberMixin): New. Mixin class to test messages sent through
1054 the Connector class
1055
1056 * test/README: Fix a typo and add the -v flag to the command for
1057 individual tests
1058
1059 * test/test_session.py: New. Test cases for Thuban.Model.session
1060
1061 * test/test_proj.py: New. Test cases for Thuban.Model.proj
1062
1063 * test/test_map.py: New. Test cases for Thuban.Model.map
1064
1065 * test/test_layer.py: New. Test cases for Thuban.Model.layer
1066
1067 * test/test_label.py: New. Test cases for Thuban.Model.label
1068
1069 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
1070
1071 * test/test_color.py: New. Test cases for Thuban.Model.color
1072
1073 * test/test_base.py: New. Test cases for Thuban.Model.base
1074
1075 2002-09-13 Bernhard Herzog <[email protected]>
1076
1077 * Thuban/Model/session.py (Session.forwarded_channels): Forward
1078 the CHANGED channel too.
1079
1080 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
1081 CHANGED channel too.
1082 (Map.__init__): Call the Modifiable constructor as well.
1083
1084 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
1085 event if the modified flag changes.
1086 (Modifiable.changed): Tweak the doc-string.
1087
1088 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
1089 (MainWindow.set_position_text): Put the code that puts the text
1090 with the mouse position into the status bar into the new method
1091 set_position_text so that it can overwritten in derived classes.
1092
1093 2002-09-12 Bernhard Herzog <[email protected]>
1094
1095 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
1096 message box on the main window.
1097
1098 2002-09-11 Bernhard Herzog <[email protected]>
1099
1100 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
1101 the 'E' because it's less likely to interfere with other menu
1102 entries.
1103 (MainWindow.build_menu): remove an incorrect comment.
1104
1105 2002-09-10 Bernhard Herzog <[email protected]>
1106
1107 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
1108 (_tool_command): Add sensitive parameter
1109 (_has_visible_map): Sensitivity callback to tools and other
1110 commands that require a visible map. Use it in map_zoom_in_tool,
1111 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
1112 and map_full_extent
1113
1114 2002-09-06 Bernhard Herzog <[email protected]>
1115
1116 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
1117 VIEW_POSITION
1118
1119 2002-09-04 Frank Koormann <[email protected]>
1120
1121 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
1122
1123 2002-09-02 Bernhard Herzog <[email protected]>
1124
1125 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
1126 wxWindows already and our implementation doesn't work correctly
1127 with wxGTK 2.3:
1128 (MapCanvas.__init__): Remove the instance variable
1129 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
1130 be drawin
1131 (MapCanvas.OnIdle): Removed.
1132
1133 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
1134 a parameter to determine the size of the rectangle.
1135 (MapCanvas.find_shape_at): Create the box around the point on a
1136 layer by layer basis and make the size depend on the shape type.
1137 This solves a problem with the selection of point shapes at the
1138 border of the layer's bounding box
1139
1140 2002-08-30 Bernhard Herzog <[email protected]>
1141
1142 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
1143 for the sensitivity of remove layer.
1144 (_can_remove_layer): New. Sensitivity callback for remove layer
1145 (Command layer_remove): Use _can_remove_layer
1146
1147 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
1148 determine whether a given layer can be deleted.
1149
1150 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
1151 (MapCanvas.do_redraw): Get rid of the unused update_region
1152 instance variable
1153
1154 * Thuban/UI/view.py: Add/update some doc-strings.
1155
1156 * test/: new subdirectory with a bunch of unit tests.
1157
1158 * test/README, test/test_table.py, test/test_save.py,
1159 test/test_menu.py, test/test_load.py: Initial set of tests and
1160 brief instructions on how to run them
1161
1162 2002-08-29 Bernhard Herzog <[email protected]>
1163
1164 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
1165 arcs with multiple parts.
1166
1167 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
1168 Handle degenrate rectangles.
1169
1170 * Thuban/Model/table.py: Make writing records work correctly:
1171 (Table.__init__): Keep track of whether the DBF is open for
1172 writing
1173 (Table.write_record): Open the DBF file for writing when necessary
1174
1175 2002-08-27 Bernhard Herzog <[email protected]>
1176
1177 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
1178 dbf files only for reading by default. Use a new writable dbf
1179 object for writing.
1180
1181 2002-08-26 Bernhard Herzog <[email protected]>
1182
1183 * Thuban/UI/mainwindow.py: Refactor the context creation:
1184 (MainWindow.Context): New method to return a context
1185 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
1186 new method
1187
1188 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
1189 layer table specific code from TableGrid into LayerTableGrid
1190 (TableFrame, LayerTableFrame): Split the layer table specific code
1191 from TableFrame into LayerTableFrame
1192 (LayerTableGrid.select_shape): Remove a debug print
1193
1194 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
1195 LayerTableFrame
1196
1197 2002-08-23 Bernhard Herzog <[email protected]>
1198
1199 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
1200 absolute filename.
1201
1202 2002-08-22 Bernhard Herzog <[email protected]>
1203
1204 * Thuban/Model/table.py (Table.write_record): New method to write
1205 records.
1206 (Table.__init__): Open the DBF file for writing too.
1207
1208 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
1209 into the underlying table.
1210
1211 * extensions/shapelib/shapefil.h (DBFCommit),
1212 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
1213 commit any changes made to the DBF file.
1214
1215 * Thuban/UI/mainwindow.py (make_check_current_tool)
1216 (_tool_command): Put the code that generates the "checked"
1217 callback into a separate function so that we can reuse it
1218 elsewhere
1219
1220 * Thuban/Model/save.py (Saver): New class to handle serializing a
1221 session into an XML file. The main reason to introduce a class is
1222 that applications built on Thuban can derive from it so that they
1223 can save additional information in a session file.
1224 (save_session): Delegate almost all the work to the Saver class.
1225 Rename the filename argument to file because it may be a file like
1226 object now.
1227
1228 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
1229 code. Remove the little test code which would be executed when the
1230 module is run as a script which didn't work anymore since it can't
1231 import the other Thuban modules.
1232 (ProcessSession, load_session): Refactor the ProcessSession to
1233 have one method for each element start and end tag so that derived
1234 classes can easily override the processing of individual tags.
1235 Also, always parse with namespaces enabled because applications
1236 built on top of Thuban will likely use namespaces if they extend
1237 the session file format.
1238
1239 2002-08-21 Bernhard Herzog <[email protected]>
1240
1241 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
1242 because thubaninit_contents will do it for us.
1243
1244 2002-08-16 Jan-Oliver Wagner <[email protected]>
1245
1246 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
1247 tree window already open
1248
1249 2002-08-15 Bernhard Herzog <[email protected]>
1250
1251 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
1252 with self.
1253
1254 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
1255 when we have actually captured it.
1256
1257 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
1258 shapefile and destroy the table.
1259
1260 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
1261
1262 2002-08-14 Bernhard Herzog <[email protected]>
1263
1264 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
1265 instance variable columns
1266 (RecordTable.GetTypeName): row and col may be negative in some
1267 cases.
1268
1269 * setup.py (InstallLocal.initialize_options)
1270 (InstallLocal.finalize_options, InstallLocal.user_options): New
1271 option create-init-file to build a thubaninit.py when running
1272 install_local
1273 (InstallLocal.run): Create the thubaninit.py module when requested
1274 (thubaninit_contents): Split the template into several parts and
1275 create a new function thubaninit_contents that creates the
1276 contents of a thubaninit module.
1277 (ThubanInstall.run): Use the new function to create the thubaninit
1278 module.
1279
1280 2002-07-30 Bernhard Herzog <[email protected]>
1281
1282 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
1283 cleanup.
1284 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
1285
1286 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
1287 direct base class' Destroy method.
1288
1289 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
1290 layers.
1291 (Map.Destroy): Destroy the label_layer as well and call the
1292 inherited Desatroymethod first so that no more messages are
1293 issued.
1294 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
1295 message if the stacking order actually has changed. Add
1296 doc-strings.
1297 (Map.BoundingBox): Correct the doc-string.
1298 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
1299 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
1300
1301 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
1302 all labels.
1303
1304 2002-07-29 Bernhard Herzog <[email protected]>
1305
1306 * Thuban/Model/map.py (Map.subscribe_layer_channels)
1307 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
1308 to a layer's channels into separate methods.
1309 (Map.RemoveLayer, Map.AddLayer): Call the new methods
1310 (Map.Destroy): Unsubscribe from a layer's channels before
1311 destroying it.
1312
1313 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
1314 selected_layer parameter to searched_layer which is the layer to
1315 search in.
1316 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
1317 search to that layer. Return the selected layer and shape.
1318
1319 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
1320 typo
1321
1322 2002-07-24 Bernhard Herzog <[email protected]>
1323
1324 * Thuban/UI/application.py (ThubanApplication.create_session):
1325 Extend the doc string.
1326 (ThubanApplication.subscribe_session)
1327 (ThubanApplication.unsubscribe_session): New methods to
1328 subscribe/unsubscribe to/from session channels.
1329 (ThubanApplication.SetSession): Call the new methods here.
1330 (ThubanApplication.maps_changed, ThubanApplication.set_map):
1331 Renamed set_map to maps_changed. Its now a subscriber for
1332 MAPS_CHANGED.
1333
1334 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
1335 x-coordinate in case of simple clicks
1336
1337 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
1338 don't pass it as a parameter
1339
1340 * Thuban/Model/session.py (Session.RemoveMap): New
1341
1342 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
1343 window size into a parameter.
1344
1345 2002-07-23 Bernhard Herzog <[email protected]>
1346
1347 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
1348 just commands.
1349
1350 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
1351 parameter list a bit to allow setting the window title and the
1352 initial message in the status bar. Update the callers.
1353
1354 * Thuban/UI/application.py (ThubanApplication.OnInit)
1355 (ThubanApplication.CreateMainWindow): Put the mainwindow
1356 instantiation into a separate method so that it can be overridden
1357 by a subclass.
1358
1359 2002-07-19 Bernhard Herzog <[email protected]>
1360
1361 * Thuban/Model/session.py: Issue a CHANGED message every time
1362 another changed message is issued to make it easier to get
1363 notified of changes.
1364 (Session): Update the doc string
1365 (Session.forward): Issue changed-events as CHANGED as well.
1366 (Session.changed): Overwrite the inherited version to issue
1367 CHANGED events as well.
1368
1369 * Thuban/UI/tree.py: We can now simply subscribe to the session's
1370 CHANGED channel to be informed of changes.
1371 (SessionTreeCtrl.session_channels): Not needed any longer.
1372 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
1373 Only have to (un)subscribe CHANGED
1374
1375 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
1376
1377 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
1378 for the wxPython locale bug to __init__.py so that it's
1379 automatically executed by anybody using UI code from Thuban.
1380
1381 2002-07-18 Bernhard Herzog <[email protected]>
1382
1383 * Thuban/UI/main.py (main): app no longer needs to be global
1384
1385 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
1386 as parameter and store it in an instance variable
1387 (MainWindow.invoke_command, MainWindow.update_command_ui)
1388 (MainWindow.save_modified_session, MainWindow.NewSession)
1389 (MainWindow.OpenSession, MainWindow.SaveSession)
1390 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
1391 application object.
1392
1393 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
1394 the main window with self.
1395
1396 * Thuban/UI/context.py: New module with the context class
1397
1398 * Thuban/UI/command.py (Command): Update doc string.
1399
1400 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
1401 MainWindow.update_command_ui): Pass an instance of the context
1402 class to the command's methods
1403 (check_current_tool, call_method): Handle the new context
1404 implementation
1405
1406 * Examples/simple_extensions/simple_tool.py (simple_tool,
1407 check_simple_tool): Handle the new context implementation
1408
1409 * Examples/simple_extensions/simple_command.py (simple_command):
1410 Handle the new context implementation. Update the comments about
1411 the context.
1412
1413 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
1414 doc-string
1415 (ThubanApplication.Session): New method to return the session
1416 object
1417
1418 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
1419 interactor's selected_layer may not be a layer of the current
1420 session when the tree is updated while a new session is being set.
1421
1422 2002-07-17 Bernhard Herzog <[email protected]>
1423
1424 * Thuban/UI/tree.py (color_string): Removed. No longer used.
1425 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
1426 update_tree into update_tree and add_items. The tree now uses a
1427 more generic way to display the contents of the tree.
1428 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
1429
1430 * Thuban/Model/layer.py (Layer.TreeInfo),
1431 Thuban/Model/extension.py (Extension.TreeInfo),
1432 Thuban/Model/map.py (Map.TreeInfo),
1433 Thuban/Model/session.py (Session.TreeInfo):
1434 Add TreeInfo methods to implement the new tree view update scheme
1435
1436 2002-07-16 Bernhard Herzog <[email protected]>
1437
1438 * Thuban/UI/application.py: Don't use "import from" for the
1439 MainWindow. It can't always be resolved.
1440 (ThubanApplication.OnInit): change reference to MainWindow
1441 accordingly.
1442
1443 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
1444 completely
1445
1446 2002-07-10 Bernhard Herzog <[email protected]>
1447
1448 * setup.py (create_init_module): New configurable variable whose
1449 default depends on the platform we're running on.
1450 (ThubanInstall.initialize_options): Initialize
1451 self.create_init_module from the global create_init_module
1452 (ThubanInstall.user_options): indictate that the options
1453 create-init-module and init-module-dir have arguments.
1454
1455 * setup.py: In the setup call change the version number to include
1456 cvs.
1457
1458 * MANIFEST.in: Add the files in Examples
1459
1460 2002-07-09 Bernhard Herzog <[email protected]>
1461
1462 * setup.py: In the setup call, use the thuban homepage as the
1463 value of the url parameter.
1464
1465 * Examples: New subdirectory for examples.
1466
1467 * Examples/simple_extensions/simple_tool.xpm,
1468 Examples/simple_extensions/simple_tool.py,
1469 Examples/simple_extensions/simple_command.py,
1470 Examples/simple_extensions/README: Simple examples showing how to
1471 add new commands and tools.
1472
1473 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
1474 bdist_rpm that we also have an install script.
1475 (bdist_inno): Add 2002 to the copyright notice.
1476
1477 * setup.py: Create a file in python's site-packages directory to
1478 make installation of Thuban as a library easier.
1479 (ThubanInstall.user_options): Add two new options,
1480 create-init-module and init-module-dir
1481 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
1482 filenames for installation in the default directories.
1483 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
1484 the inherited methods to capture some filenames before they're
1485 transformed too much by distutils.
1486 (ThubanInstall.run): Create the init module if requested.
1487 (ThubanInstall.thuban_init_filename): New method to return the
1488 full name of the init module.
1489 (ThubanInstall.get_outputs): Append the filename of the init
1490 module.
1491
1492 2002-07-08 Bernhard Herzog <[email protected]>
1493
1494 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
1495 handle the prefix properly which means that the default for the
1496 installation prefix should be /usr for RPMs and /usr/local when
1497 doing a normal source install.
1498 (bdist_rpm_install_script): Script to override the default install
1499 commands in the specfile generated by the bdist_rpm command.
1500 (thuban_bdist_rpm.user_options): Add a prefix option
1501 (thuban_bdist_rpm.initialize_options): Init the prefix option.
1502 Create the script files for the spec files as empty files here
1503 (thuban_bdist_rpm._make_spec_file): Override the inherited method
1504 to fill the script files with content.
1505
1506 * Thuban/Model/save.py (relative_filename): Wrapper around
1507 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
1508 argument. save_session now automatically uses this version,
1509 solving a problem when saving to a relative filename.
1510
1511 * setup.py: In the setup call, make sure that the library
1512 directories are under $prefix/lib not directly under $prefix.
1513
1514 2002-06-20 Jan-Oliver Wagner <[email protected]>
1515
1516 * Thuban/Model/extension.py: new module to handle extension objects.
1517 * Thuban/Model/messages.py: new messages for extensions.
1518 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
1519 Session.AddExtension): new for handling extensions.
1520 Also some other minor changes to round up extension handling.
1521 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
1522 of Extension titles and title and names of its objects.
1523
1524 2002-05-29 Bernhard Herzog <[email protected]>
1525
1526 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
1527 the events for a command.
1528 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
1529 Call bind_command_events to bind the events. add_toolbar_command
1530 can now bind events too so that it's possible to have commands
1531 that are only available through the toolbar.
1532 (MainWindow.init_ids): New instance variable events_bound to keep
1533 track of for which commands events have been bound.
1534
1535 2002-05-28 Bernhard Herzog <[email protected]>
1536
1537 * Thuban/UI/menu.py: New module to build and manage menus.
1538
1539 * Thuban/UI/mainwindow.py: Remove some unused imports.
1540 (MainWindow.__init__, main_menu): move the definition of the main
1541 menu from __init__ to the Menu instance main_menu.
1542 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
1543 build the menu bar and sub-menus from a menu description.
1544
1545 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
1546 startup file
1547 (ThubanApplication.read_startup_files): New method to run
1548 ~/.thuban/thubanstart.py
1549
1550 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
1551 Move the toolbar definition to the Menu instance main_toolbar.
1552 (MainWindow.build_toolbar): New method to build the toolbar
1553 similar to the build_menu methods
1554
1555 2002-05-23 Bernhard Herzog <[email protected]>
1556
1557 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
1558 layer_outline_color. Fix it in the definition of the command too.
1559
1560 * Thuban/UI/command.py (Command): Fix typo in doc string
1561
1562 2002-05-22 Bernhard Herzog <[email protected]>
1563
1564 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
1565 in the docstring
1566
1567 2002-05-15 Bernhard Herzog <[email protected]>
1568
1569 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
1570 when the shapefile is empty.
1571 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
1572 now return None for empty shapefiles. Update doc-strings.
1573
1574 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
1575 the layer's bbox being None.
1576
1577 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
1578 layer's bbox being None.
1579
1580 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
1581 necessary.
1582 (MapCanvas.__init__): New instance variables, last_selected_layer
1583 and last_selected_shape to determine how the selection has
1584 changed.
1585
1586 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
1587 AutoSizeColumns because it will cause a traversal of the entire
1588 table which for large .dbf files will take a very long time.
1589
1590 2002-05-14 Bernhard Herzog <[email protected]>
1591
1592 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
1593 maximum depth for the tree than shapelib does by default.
1594
1595 2002-05-10 Bernhard Herzog <[email protected]>
1596
1597 * setup.py (py_modules): The shptree modules doesn't have a
1598 wrapper, so don't include it in the py_modules
1599
1600 2002-05-08 Bernhard Herzog <[email protected]>
1601
1602 * extensions/shapelib/shptree.c (compare_ints): Make arguments
1603 const void * as in the qsort prototype
1604 (SHPTreeFindLikelyShapes): Remove some unused variables.
1605
1606 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
1607 maintains to redraw the window during a drag.
1608 (MapCanvas.unprojected_rect_around_point): New method to determine
1609 a small region around a point for hit-testing.
1610 (MapCanvas.find_shape_at): Only test the shapes in a small region
1611 around the point.
1612
1613 * setup.py: Increment the version to 0.1.2
1614
1615 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
1616 debug print and set session to None after unsubscribing
1617
1618 2002-05-07 Bernhard Herzog <[email protected]>
1619
1620 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
1621 the file to have a .thuban extension.
1622
1623 * Thuban/UI/tree.py (session_channels): New class constant with
1624 all the session channels to subscribe to to update the tree
1625 (SessionTreeCtrl.session_changed): Remember the session so that we
1626 can unsubscribe properly. Use the new class constant to
1627 unsubscribe from the old session and subscribe to the new one.
1628 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
1629 subscriptions of the SessionTreeCtrl.
1630 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
1631
1632 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
1633 Session Tree" command to the file menu.
1634
1635 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
1636 as update_region to the renderer.
1637
1638 * Thuban/UI/renderer.py
1639 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
1640 update box is now directly a tuple, not a wxRect anymore.
1641
1642 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
1643 prints.
1644
1645 2002-05-07 Bernhard Herzog <[email protected]>
1646
1647 * setup.py: Add the shptree extension module. See
1648 extensions/pyshapelib/ChangeLog for more details.
1649
1650 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
1651 extensions/shapelib/dbfopen.c: Really update to the versions of
1652 shapelib 1.2.9. For some reason it wasn't really done on
1653 2002-04-11.
1654
1655 * extensions/shapelib/shptree.c: Modified version of shptree.c of
1656 shapelib 1.2.9. The only real difference is the use of qsort
1657 instead of a bubble sort implementation
1658
1659 * Thuban/Model/layer.py (Layer.__init__): New instance variable
1660 shapetree to hold the shapelib quadtree for the shapefile
1661 (Layer.open_shapefile): Create the quad tree.
1662 (Layer.ShapesInRegion): New method to return the ids of shapes in
1663 a given region using the quad tree.
1664
1665 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
1666 comment
1667 (draw_polygon_shape): Accept both arcs and polygons.
1668 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
1669 the api.
1670
1671 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
1672 return the shape ids to be rendered in a given layer.
1673 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
1674 ids. Use draw_polygon_shape to draw arc shapes as well.
1675 (ScreenRenderer.RenderMap): New parameter for the rectangle that
1676 has to be updated
1677 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
1678 calling it's ShapesInRegion method.
1679
1680 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1681 update_region for the update region.
1682 (MapCanvas.OnPaint): Maintain the update region
1683 (MapCanvas.do_redraw): Pass the bounding box of the update_region
1684 to the renderer when drawing the bitmap. Reset the update_region.
1685
1686 2002-05-03 Bernhard Herzog <[email protected]>
1687
1688 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
1689 MainWindow.OpenSession): Change the file extension of the session
1690 files to .thuban
1691
1692 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
1693 Move the map channels to be forwarded by the session into the
1694 class constant with forwarded_channels. Also add
1695 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
1696 forwarded_channels
1697
1698 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
1699 typo and some rewording).
1700
1701 2002-05-02 Bernhard Herzog <[email protected]>
1702
1703 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
1704 around to speed up most redraws:
1705 (MapCanvas.__init__): New instance variable bitmap which holds the
1706 bitmap
1707 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
1708 self.bitmap to draw.
1709 (MapCanvas.full_redraw): New method to force a full redraw
1710 including the bitmap
1711 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
1712 make sure the bitmap is redrawn.
1713 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
1714 MapCanvas.shape_selected): Call full_redraw instead of readraw to
1715 make sure the bitmap is redrawn.
1716 (MapCanvas.OnSize): New method to handle size events so that the
1717 bitmap can be redrawn.
1718
1719 2002-04-29 Bernhard Herzog <[email protected]>
1720
1721 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
1722 canvas' VIEW_POSITION event
1723 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
1724 Update the text in the status-bar accordingly.
1725
1726 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
1727 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
1728 called.
1729 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
1730 current_position
1731 (MapCanvas.set_current_position): New method to set
1732 current_position. Issue a VIEW_POSITION event
1733 (MapCanvas.CurrentPosition): New public method to return the value
1734 of current_position. Should be called when the VIEW_POSITION event
1735 is processed.
1736 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
1737 Update the position.
1738 (MapCanvas.OnLeaveWindow): Set the position to None.
1739
1740 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
1741 position in the statusbar
1742
1743 2002-04-26 Frank Koormann <[email protected]>
1744
1745 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
1746
1747 2002-04-24 Frank Koormann <[email protected]>
1748
1749 * Resources/Bitmaps/identify.xpm: shadow added
1750
1751 * Resources/Bitmaps/fullextent.xpm: new
1752
1753 2002-04-22 Jan-Oliver Wagner <[email protected]>
1754
1755 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
1756 box
1757
1758 2002-04-21 Jan-Oliver Wagner <[email protected]>
1759
1760 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
1761
1762 * Thuban/UI/tree.py (update_tree): added added map extent
1763
1764 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
1765 icon; added map_full_extend as tool
1766
1767 2002-04-19 Jan-Oliver Wagner <[email protected]>
1768
1769 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
1770 saving _new_ sessions
1771
1772 * Thuban/Model/session.py (create_empty_session): new session
1773 don't have a filename (set to None)
1774
1775 * Thuban/UI/tree.py (update_tree): added filename and modified flag
1776
1777 * Thuban/Model/load.py (ProcessSession): convert projection
1778 parameters from unicode to regular string
1779
1780 * Data/iceland_sample.session: Added UTM Zone 26 projection.
1781
1782 2002-04-11 Bernhard Herzog <[email protected]>
1783
1784 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
1785 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
1786 1.2.9
1787
1788 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
1789 the pyshapelib directoy into the list of include dirs, so that
1790 pyshapelib_api.h can be found.
1791
1792 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
1793 holds the pyshapelib C-API
1794 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
1795 pyshapelib_api to access the shapelib functions.
1796 (initwxproj): Import the c_api from the shapelib module and
1797 initialize pyshapelib_api.
1798
1799 2002-04-04 Bernhard Herzog <[email protected]>
1800
1801 * setup.py (thuban_bdist_rpm.initialize_options): Use
1802 initialize_options to create the scripts for the rpm.
1803
1804 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
1805
1806 2002-04-03 Bernhard Herzog <[email protected]>
1807
1808 * setup.py: Increment version to 0.1.1
1809
1810 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
1811 Layer" and "Remove Layer" commands from the layer menu to the map
1812 menu
1813
1814 2002-02-15 Bernhard Herzog <[email protected]>
1815
1816 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
1817 argument (python <= 1.5.2 erroneously accepted multiuple
1818 arguments)
1819
1820 2002-02-04 Bernhard Herzog <[email protected]>
1821
1822 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
1823 RecordGrid in the identifyview.
1824 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
1825 IdentifyListCtrl. The grid allows editing of the values.
1826
1827 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
1828 implementing a grid for a single row of a thuban table.
1829
1830 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
1831 layers by default. Easier to use than the previous default of only
1832 searching through the select layer which meant that if no layer
1833 was selected, you couldn't select a shape.
1834
1835 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
1836
1837 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
1838 stroke_width attribute
1839
1840 * Thuban/Model/save.py (save_session): Write the new stroke_width
1841 attribute
1842
1843 * Thuban/Model/load.py (ProcessSession.startElement): Read the
1844 stroke_width attribute
1845
1846 * Thuban/Model/layer.py (Layer.__init__): New parameter and
1847 instance variable stroke_width
1848 (Layer.SetStrokeWidth): Set the stroke_width.
1849
1850 2002-02-01 Bernhard Herzog <[email protected]>
1851
1852 * extensions/thuban/wxproj.cpp (project_points): Fix two
1853 off-by-one errors in the last loop that joins the various parts
1854 together.
1855
1856 2002-01-14 Bernhard Herzog <[email protected]>
1857
1858 * setup.py (data_dist.make_distribution): Fix some typos
1859
1860 2001-09-18 Bernhard Herzog <[email protected]>
1861
1862 * README: Slight tweaking in preparation for the 0.1 release
1863
1864 * setup.cfg: Add section for sdist to create both tgz and zip
1865 archives
1866
1867 * setup.py: increase version number to 0.1
1868 (data_dist): New command class for data distribution
1869
1870 2001-09-14 Bernhard Herzog <[email protected]>
1871
1872 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
1873 Handle the case of no layer (i.e. layer is None) properly.
1874
1875 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
1876 Set the initial selection of the combo boxes to reflect the
1877 projection we're starting with in a way that works on windows,
1878 too.
1879
1880 * Thuban/Lib/connector.py (Connector.print_connections): Print the
1881 puiblisher's ids in hex to make it easier to compare them to the
1882 standard repr of python methods
1883
1884 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
1885 messages
1886
1887 2001-09-13 Bernhard Herzog <[email protected]>
1888
1889 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
1890 deselect the layer if no layer is selected
1891
1892 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
1893 idle time when there actually is something to draw. If there's
1894 nothing to draw simply clear the window
1895 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
1896 (MapCanvas.SetMap): force a redraw in all cases because
1897 FitMapToWindow doesn't always do it.
1898 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
1899 specify the point to move into the center of the window
1900 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
1901 dragged, zoon in/out by a factor of 2
1902 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
1903 index, i.e. reversed drawing order) so that objects appearing to
1904 be in from of others are selected first. This is probably mostly
1905 relevant for point shapes where the symbols used may overlap
1906
1907 * Thuban/Model/session.py (create_empty_session): Unset the
1908 modified bit before returning it
1909
1910 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
1911 create_empty_session session to create the new, empty session.
1912
1913 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
1914 the tool bitmaps.
1915 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
1916 the code that asks whether the session should be saved into the
1917 new method save_modified_session.
1918 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
1919 method to save modified session here too.
1920
1921 2001-09-11 Bernhard Herzog <[email protected]>
1922
1923 * setup.py (InnoIconItem): fix typo
1924
1925 (thuban_bdist_inno.run):
1926 (bdist_inno.run): Move the decision not to create symlinks on
1927 non-nt platforms to thuban_bdist_inno and do it unconditinally
1928 since we never want to create the symlinks here
1929
1930 2001-09-10 Bernhard Herzog <[email protected]>
1931
1932 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
1933 identify view immediately
1934
1935 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
1936 and SelectableRecordListCtrl that implement the code shared by the
1937 identify view and the label dialog
1938
1939 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
1940 new class RecordListCtrl
1941
1942 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
1943 return value of GetValue is None instead of using it as a boolean
1944 directly so that Zero numbers are handled properly.
1945 (LabelListCtrl): Derive from the new class
1946 SelectableRecordListCtrl
1947
1948 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
1949 (Proj4Dialog.dialogLayout): Make the window resizable and set the
1950 size of the text control explicitly to make the sizers work on
1951 both Windows and X.
1952
1953 2001-09-07 Bernhard Herzog <[email protected]>
1954
1955 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
1956 that can limit the search to the currently selected layer.
1957 (MapCanvas.SelectShapeAt): Make sure that the currently selected
1958 layer stays selected even when no shape is found
1959 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
1960 height do nothing (avoids zero division errors)
1961
1962 2001-09-06 Bernhard Herzog <[email protected]>
1963
1964 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
1965 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
1966 convenient :-)
1967 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
1968 a new instvar layer_to_item to map layers to tree items
1969 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
1970 to match the current selection in the interactor
1971
1972 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
1973 (Interactor.HasSelectedLayer): New methods to query the current
1974 selection
1975
1976 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
1977 (MainWindow.has_selected_layer): Simply call the appropriate
1978 interactor method
1979
1980 * Thuban/UI/mainwindow.py (MainWindow.__init__):
1981 (MainWindow.LayerShowTable):
1982 (MainWindow.identify_view_on_demand): Store the interactor in an
1983 instvar and use that reference instead of going through main.app
1984
1985 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
1986 * Thuban/UI/application.py (ThubanApplication.OnInit):
1987 * Thuban/UI/main.py (main): Create the session tree view in main
1988 with the new mainwindow method ShowSessionTree and not directly
1989 the application's OnInit method
1990
1991 * Thuban/UI/tree.py (myTreeCtrlPanel):
1992 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
1993 TreeCtrl isntead of a panel. This affects most method since we now
1994 refer to self instead of self.tree
1995 (SessionTreeView): New class implementing a non-modal dialog
1996 showing the session tree.
1997
1998 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
1999 layer to the tableview dialog.
2000
2001 * Thuban/UI/tableview.py: Add some doc-strings
2002 (TableGrid):
2003 (TableGrid.OnRangeSelect):
2004 (TableGrid.OnSelectCell):
2005 (TableFrame.__init__):
2006 (TableFrame.row_selected):
2007 Selecting rows in the grid view now updates the selected shapes
2008 through the TableFrame. To achieve this we derive TableGrid from
2009 Publisher and introduce the message type ROW_SELECTED which the
2010 TableFrame subscribes to and which is issued by OnRangeSelect and
2011 OnSelectCell
2012
2013 (DataTable.SelectRow): Removed because it's no longer needed in
2014 the row/shape selection scheme
2015
2016 * Thuban/UI/dialogs.py: New file implementing common classes for
2017 dialogs
2018
2019 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
2020 the SELECTED_SHAPE message anymore. This is now handled by the
2021 parent.
2022 (TableGrid.select_shape): Only update the selection if the shape
2023 is not None.
2024 (TableFrame): Inherit from the new NonModalDialog class.
2025 (TableFrame.__init__, TableFrame.select_shape): Handle the
2026 SELECT_SHAPE message.
2027 (TableFrame.OnClose): Extend the inherited method to unsubscribe
2028 SELECT_SHAPE
2029
2030 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
2031 (MainWindow.add_dialog):
2032 (MainWindow.dialog_open):
2033 (MainWindow.remove_dialog):
2034 (MainWindow.get_open_dialog): New methods to maintain a dictionary
2035 of opened non-modal dialogs.
2036
2037 (MainWindow.__init__): Initialize the new non-modal dictionary
2038 management code
2039 (MainWindow.LayerShowTable): maintain separate dialogs for each
2040 table using the non-modal dialog management code to only open a
2041 view once for each table.
2042
2043 (MainWindow.IdentifyTool):
2044 (MainWindow.__init__):
2045 (MainWindow.identify_view_on_demand): Don't open the identify view
2046 in IdentifyTool anymore. This will be done automatically by the
2047 new method identify_view_on_demand which handles the
2048 SELECTED_SHAPE message so that the identify view will be opened on
2049 demand
2050
2051 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
2052 the interactor argument. The SELECTED_SHAPE message is now handled
2053 by the parent.
2054 (IdentifyView.__init__): Add the interactor argument so that we
2055 can handle the SELECTED_SHAPE message here
2056 (IdentifyView.selected_shape): New method to handle the
2057 SELECTED_SHAPE messages
2058
2059 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
2060 NonModalDialog class
2061 (IdentifyView.OnClose): Extend the inherited version to
2062 unsubscribe SELECT_SHAPE
2063
2064 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
2065
2066 2001-09-05 Bernhard Herzog <[email protected]>
2067
2068 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
2069
2070 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
2071 interactor to pass through to the MapCanvas
2072
2073 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
2074 argument to the MainWindow constructor to get rid of the ugly hack
2075 that made main.app available early just so that the mapcanvas
2076 could access the interactor object.
2077
2078 2001-09-04 Bernhard Herzog <[email protected]>
2079
2080 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
2081 that runs a modal message box
2082 (MainWindow.OnClose): Use the new method
2083 (MainWindow.RemoveLayer): Just do nothing in case no layer is
2084 selected. The command should be grayed out anyway, so there's no
2085 need to pop up a message box.
2086 (MainWindow.AddLayer): Pop up a message box with an error message
2087 if the shape file can't be opened
2088
2089 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
2090 immediately. This will cause an exception in case the file can't
2091 be opened and we can display an appropriate message.
2092
2093 * MANIFEST.in: Add extensions/pyprojection/LICENSE
2094
2095 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
2096 specific bdist_rpm command.
2097
2098 * Thuban/UI/main.py: Catch ImportError exceptions when importing
2099 the locale module because it may not be available on some
2100 installations.
2101
2102 * extensions/pyprojection/LICENSE: Copy of the license text in
2103 Projection.i. Having it in a separate file makes it easier to
2104 refer to license text in e.g. RPMs
2105
2106 2001-09-03 Bernhard Herzog <[email protected]>
2107
2108 * setup.py: use wx-config instead of wxgtk-config because it's
2109 more generic
2110
2111 * setup.py (ThubanInstall.get_outputs): Add the symlink in
2112 <prefix>/bin to the outputs
2113 (ThubanInstall.link_file): New method to link files. We need this
2114 because the standard copy_files refuses to link non-existing
2115 files.
2116 (ThubanInstall.run): Remove the leading install root from the
2117 script filename if an install root was specified and use the new
2118 link_file method
2119
2120 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
2121 the window when the first layer is added to the map.
2122
2123 * setup.py (ThubanInstall.run): Honor the build root (self.root)
2124 when linking thuban.py to <prefix>/bin
2125
2126 2001-08-31 Bernhard Herzog <[email protected]>
2127
2128 * setup.py: In the setup call, the install parameters shouldn't
2129 have trailing slashes because distutils on non-posix platforms
2130 doesn't like that. The same applies to other directories like
2131 "Resources/Bitmaps"
2132
2133 In the configuration section for nt, move the wxWindows directory
2134 optins into the part clearly marked as editable.
2135
2136 (InstallLocal.initialize_options):
2137 (InstallLocal.user_options): remove the currently unused debug
2138 flag
2139 (thuban_build_py.find_all_modules): Add this method so that it
2140 works for our case of having packages and modules in one
2141 distribution as well.
2142 (ThubanInstall.initialize_options):
2143 (ThubanInstall.finalize_options):
2144 (ThubanInstall.user_options):
2145 (ThubanInstall.boolean_options): Add new options, do-symlink and
2146 extra files. Since these are the first ThubanInstall specific
2147 options, override user_options and boolean_options
2148 (ThubanInstall.run): Honor the new do-symlink and extra-files
2149 options.
2150 (ThubanInstall.get_outputs): Add to override the base-class's
2151 version and add the extra-files to the outputs
2152 (bdist_inno): New class for windows distributions with Inno Setup
2153 (InnoIconItem): Helper class for bdist_inno
2154 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
2155 this together with the appropriate parameters, to the setup call.
2156
2157 * setup.cfg (bdist_inno): added new section for the inno setup
2158 installer
2159
2160 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
2161 changing_selection to avoid recursive selection events when
2162 modifying the selection in response to a selection event.
2163 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
2164 changing the tree's selection.
2165 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
2166 we're not being called indirectly from normalize_selection.
2167
2168 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
2169 event.Check only if the command is actuall checkable.
2170 (MainWindow.__init__): Call the toolbar's Realize method to make
2171 sure that the items are actually shown
2172
2173 2001-08-28 Bernhard Herzog <[email protected]>
2174
2175 * setup.py: Fix some doc strings
2176
2177 * ChangeLog: started
2178

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26