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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 586 - (hide annotations)
Tue Apr 1 10:41:16 2003 UTC (21 years, 11 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 76268 byte(s)
update ChangeLOg

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26