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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.120  
changed lines
  Added in v.623

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26