/[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 271 by bh, Thu Aug 22 13:46:54 2002 UTC revision 623 by bh, Mon Apr 7 10:54:54 2003 UTC
# Line 1  Line 1 
1    2003-04-07  Bernhard Herzog  <[email protected]>
2    
3            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
4            favor of ToggleSessionTree
5            (MainWindow.ToggleSessionTree): New method to toggle visibility of
6            the session tree.
7            (MainWindow.SessionTreeShown): New method to return whether the
8            session tree is currently shown.
9            (MainWindow.ToggleLegend): New method to toggle visibility of the
10            legend
11            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
12            LegendShown
13            (MainWindow.LegendShown): New method to return whether the legend
14            is currently shown.
15            (_method_command): Add checked parameter so we can define check
16            menu items
17            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
18            mainwindow methods.
19            (show_session_tree, show_legend commands): Removed.
20            (toggle_session_tree, toggle_legend commands): New commands to
21            toggle the visibility of the dialogs
22    
23    2003-04-07  Jonathan Coles   <[email protected]>
24    
25            * Thuban/UI/classgen.py: Fix Windows problem.
26    
27            * Thuban/UI/dock.py: Fix Windows problem.
28    
29            * Thuban/UI/mainwindow.py: Use False instead of false.
30            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
31    
32    2003-04-07  Jonathan Coles   <[email protected]>
33    
34            Since we now say that the order of the groups in a classification
35            matters, it makes sense to be able to manipulate that order. Most
36            of the changes to Thuban/Model/classification.py are to that end.
37    
38            * Thuban/Model/classification.py (Classification.AppendGroup,
39            Classification.InsertGroup, Classification.ReplaceGroup,
40            Classification.RemoveGroup, Classification.GetGroup): Do as the
41            names imply.
42            (Classification.FindGroup): This was called GetGroup, but GetGroup
43            takes an index, while FindGroup takes a value.
44            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
45            REFERENCE. Currently there is a cyclic reference between the layer
46            and its classification. If the classification doesn't need to know
47            its owning layer we can change this, since it may make sense to be
48            able to use the same classification with different layers.
49    
50            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
51    
52            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
53            not AddGroup()
54    
55            * Thuban/UI/classifier.py: Now that we can depend on the order in
56            a Classification and have methods to manipulate that order we don't
57            need to use our own data structures in the grid. We can simply make
58            the grid/table access the information they need from a copy of
59            the classification object.
60            (Classifier._OnCloseBtn): Event handler for when the user clicks
61            'Close'. This is needed so if the user applies changes and then
62            continues to change the table the user has the option of discarding
63            the most recent changes and keeping what they applied.
64    
65            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
66            into the same group.
67    
68            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
69            with a really old version of proj, PJ_VERSION won't even be defined.
70            If it isn't defined then just compile so that the function always
71            returns Py_False.
72    
73            * test/test_classification.py: Fix tests to use the renamed methods.
74            Still need to write tests for the new methods.
75    
76    2003-04-04  Jonathan Coles   <[email protected]>
77    
78            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
79            call to SetSelection out of the method and before the call
80            to __SelectField in __init__. This prevents a recursion of events
81            when _OnFieldSelect is triggered by the user.
82    
83    2003-04-04  Jonathan Coles   <[email protected]>
84    
85            * Thuban/Model/classification.py: Rename Color.None to
86            Color.Transparent.
87            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
88            Don't bother copying the color, since Colors are immutable.
89    
90            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
91            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
92            Thuban/UI/renderer.py, Thuban/UI/view.py:
93            Rename Color.None to Color.Transparent.
94        
95            * test/test_classification.py, test/test_load.py: Rename Color.None
96            to Color.Transparent.
97    
98    2003-04-04  Jonathan Coles   <[email protected]>
99    
100            * Thuban/Model/classification.py: Fix assert calls.
101            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
102            Copy the color parameter rather than hold onto a reference.
103    
104            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
105            the color object.
106            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
107            are sure there exists only one refernce to Color.None in the system.
108            This allows us to use 'is' rather than the comparision functions.
109            
110            * Thuban/Model/save.py: Fix assert calls.
111            
112            * Thuban/UI/classifier.py: Fix assert calls.
113            (ClassGrid._OnCellDClick): Call up to the classifier to open the
114            dialog to edit the groups properties.
115            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
116            correctly if a cell is resized.
117            (ClassTable.SetClassification): New. Changes the classification
118            that is in the table.
119            (ClassTable.__SetRow): Allow groups to be prepended.
120            (Classifier): New code for opening the EditProperties and
121            GenerateRanges dialogs.
122            (SelectPropertiesDialog.__GetColor): Only set the color in the
123            color dialog if the current color is not None.
124            
125            * Thuban/UI/dock.py: Fix assert calls.
126            
127            * Thuban/UI/legend.py: Fix assert calls.
128            
129            * Thuban/UI/renderer.py: Fix assert calls.
130            
131            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
132            classifications.
133            (GenRangePanel): Panel specific to range generation.
134            (GenSingletonPanel): Panel specific to singleton generation.
135            (ClassGenerator): Class responsible for actually generating
136            the classification from the data gathered in the dialog box.
137            (PropertyRamp): Generates properties whose values range from
138            a starting property to an ending property.
139    
140    2003-04-03  Bernhard Herzog  <[email protected]>
141    
142            * test/support.py (print_garbage_information): New function that
143            prints information about still connected messages and memory
144            leaks.
145            (run_suite): Removed.
146            (run_tests): New function for use as a replacement of
147            unittest.main in the test_* files. This one calls
148            print_garbage_information at the end.
149    
150            * test/runtests.py (main): Use support.print_garbage_information
151    
152            * test/test_layer.py: Use support.run_tests instead of
153            unittest.main so we get memory leak information
154            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
155            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
156            (TestLayerLegend.test_visibility): Call the layer's Destroy method
157            to fix a memory leak.
158    
159            * test/test_classification.py: Use support.run_tests instead of
160            unittest.main so we get memory leak information
161            (TestClassification.test_classification): Call the layer's Destroy
162            method to fix a memory leak.
163    
164    2003-04-02  Bernhard Herzog  <[email protected]>
165    
166            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
167            Handle the reference counts of the return value and errors in
168            PyArg_ParseTuple correctly.
169    
170            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
171            sure the filename is absolute to avoid problems when saving the
172            session again
173    
174            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
175    
176    2003-04-01  Jonathan Coles   <[email protected]>
177    
178            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
179            that there actually are points in the returned list of points
180            before trying to index into the list. The list may be empty if
181            the shape is a Null Shape.
182    
183    2003-04-01  Bernhard Herzog  <[email protected]>
184    
185            * test/test_map.py: Don't use from <module> import *
186    
187    2003-04-01  Jonathan Coles   <[email protected]>
188    
189            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
190            LAYER_LEGEND_CHANGED
191    
192            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
193            self.Destroy() to close the window after yesterday's changes.
194    
195            * test/test_map.py, test/test_session.py: Fix messages that
196            are sent from maps and layers.
197    
198    2003-03-31  Jonathan Coles   <[email protected]>
199    
200            * Thuban/UI/classifier.py: Commented out some debugging statements.
201            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
202            RTbug #1769.
203    
204            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
205            position (although position doesn't work yet under GTK).
206            (DockableWindow.Destroy): New. Called when the window must be
207            closed. Namely needed when the DockFrame closes and must close
208            its children.
209            (DockFrame): Listen for EVT_CLOSE and destroy all children.
210    
211            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
212            when then window is told to close.
213            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
214            comment in source for more info.
215    
216            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
217    
218            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
219            symmetry with other such methods.
220            (MainWindow.ShowLegend): Show the legend docked by default.
221    
222    2003-03-28  Jonathan Coles   <[email protected]>
223    
224            * Thuban/UI/classifier.py: Support for highlighting a specific
225            group within the grid when the classification dialog is opened.
226            Also contains a lot of debugging printouts which will later
227            be removed.
228    
229            * Thuban/UI/dock.py: Complete rework on the dock code so that
230            that it is fairly removed from the rest of the Thuban application.
231            It is easy to add new docks which the rest of the program having
232            to be aware of them.
233    
234            * Thuban/UI/legend.py: Modifications to support selecting a
235            specific group in the classification dialog. Changed how layers
236            are drawn when the layer is visible/invisible.
237    
238            * Thuban/UI/mainwindow.py: Removed legend specific code and
239            replaced it with calls to the new dock code.
240    
241            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
242            to check if scale > 0. Trying to track down a divide by zero.
243    
244    2003-03-26  Jonathan Coles   <[email protected]>
245    
246            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
247            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
248            now part of DockableWindow.
249            (LegendPanel.DoOnSelChanged): Select the current layer in the
250            map.
251            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
252            with the selected layer and/or group.
253    
254    2003-03-26  Jonathan Coles   <[email protected]>
255    
256            This putback contains the code for dockable windows. There is
257            no support in wxWindows as of this date for windows that can
258            attach themselves to other windows.
259    
260            The current model contains a DockableWindow which has a parent
261            window for when it is detached and a dock window that it puts
262            its contents in when it is docked. The contents of a DockableWindow
263            must be a DockPanel. DockPanel itself derives from wxPanel.
264    
265            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
266            message, not a LAYER_LEGEND_CHANGED message.
267    
268            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
269    
270            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
271            as one of the style properties for the fieldTypeText item to
272            be sure that its size is correct when the text changes.
273    
274            * Thuban/UI/dock.py: New. Classes for the DockPanel and
275            DockableWindow.
276    
277            * Thuban/UI/legend.py: Added some more buttons and made the
278            LegendPanel a DockPanel.
279    
280            * Thuban/UI/mainwindow.py: Added sash windows to the main window
281            and supporting functions for manipulating the sashes.
282            (MainWindow.ShowLegend): Create a DockableWindow with the
283            LegendPanel as the contents.
284    
285            * Thuban/UI/messages.py: Added DOCKABLE_* messages
286    
287            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
288            not LAYER_LEGEND_CHANGED, messages.
289    
290    2003-03-25  Jonathan Coles   <[email protected]>
291    
292            * setup.py: Added custom script bdist_rpm_build_script so that
293            when the rpm is built the path to wx-config is correct.
294    
295            * setup.cfg: Added line saying to use the custom build script
296    
297    2003-03-20  Jonathan Coles   <[email protected]>
298    
299            Initial implementation of the Legend.
300    
301            * Thuban/UI/legend.py: New. Creates a window that shows the map's
302            Legend information and allows the user to add/modify classifications
303            and how the layers are drawn on the map.
304    
305            * setup.py: New command 'build_docs' which currently uses
306            happydoc to generate html documentation for Thuban.
307    
308            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
309            Returns a string which is appropriately describes the group.
310    
311            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
312            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
313    
314            * Thuban/Model/map.py (Map): Rename messages and use new, more
315            specific, messages.
316    
317            * Thuban/Model/messages.py: New message to indicate that a layer's
318            data has changed (LAYER_CHANGED). New map messages to indicate
319            when layers have been added/removed/changed or if the stacking order
320            of the layers has changed.
321    
322            * Thuban/Model/session.py: Rename and use new messages.
323    
324            * Thuban/UI/classifier.py: Remember if any changes have actually
325            been applied so that if the dialog is cancelled without an application
326            of changes we don't have to set a new classification.
327            (ClassDataPreviewer): Pulled out the window specific code and put it
328            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
329            symbols on any DC.
330            
331            * Thuban/UI/mainwindow.py: New code to open the legend.
332    
333            * Thuban/UI/view.py: Use new message names.
334    
335    2003-03-19  Jonathan Coles   <[email protected]>
336    
337            * Thuban/UI/main.py (verify_versions): New. Checks the versions
338            of Python, wxPython, and some other libraries.
339    
340            * extensions/thuban/wxproj.cpp (check_version): Checks the given
341            version against what wxproj was compiled with.
342            (check_version_gtk): If wxproj was compiled with gtk then check
343            the given version against the version of the gtk library
344            currently being used.
345    
346    2003-03-14  Bernhard Herzog  <[email protected]>
347    
348            * test/test_command.py: Run the tests when the module is run as a
349            script
350    
351    2003-03-14  Bernhard Herzog  <[email protected]>
352    
353            Implement selection of multiple selected shapes in the same layer:
354    
355            - Introduce a new class to hold the selection. This basically
356              replaces the interactor which was nothing more than the
357              selection anyway. A major difference is of course that the new
358              selection class supports multiple selected shapes in one layer
359            
360            - Move the object that represents the selection from the
361              application to the canvas. The canvas is a better place than the
362              application because the selection represents which shapes and
363              layer of the map displayed by the canvas are selected and
364              affects how the map is drawn.
365    
366            - Make the selection and its messages publicly available through
367              the mainwindow.
368    
369            - The non-modal dialogs do not get a reference to the interactor
370              anymore as they can simply refer to their parent, the
371              mainwindow, for the what the interactor had to offer.
372    
373            * Thuban/UI/selection.py: New module with a class to represent the
374            selection.
375    
376            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
377            these unused messages
378    
379            * Thuban/UI/application.py (ThubanApplication.OnInit)
380            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
381            interactor is gone now.
382            (ThubanApplication.CreateMainWindow): There is no interactor
383            anymore so we pass None as the interactor argument for now for
384            compatibility.
385    
386            * Thuban/UI/view.py (MapCanvas.delegated_messages)
387            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
388            Unsubscribe, delegate messages according to the delegated_messages
389            class variable.
390            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
391            attributes from instance variables as described with the
392            delegated_methods class variable.
393            (MapCanvas.__init__): New instance variable selection holding the
394            current selection
395            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
396            pass them on to the renderer
397            (MapCanvas.SetMap): Clear the selection when a different map is
398            selected.
399            (MapCanvas.shape_selected): Simple force a complete redraw. The
400            selection class now takes care of only issueing SHAPES_SELECTED
401            messages when the set of selected shapes actually does change.
402            (MapCanvas.SelectShapeAt): The selection is now managed in
403            self.selection
404    
405            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
406            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
407            Unsubscribe, delegate messages according to the delegated_messages
408            class variable.
409            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
410            attributes from instance variables as described with the
411            delegated_methods class variable.
412            (MainWindow.__init__): The interactor as ivar is gone. The
413            parameter is still there for compatibility. The selection messages
414            now come from the canvas.
415            (MainWindow.current_layer, MainWindow.has_selected_layer):
416            Delegate to the the canvas.
417            (MainWindow.LayerShowTable, MainWindow.Classify)
418            (MainWindow.identify_view_on_demand): The dialogs don't need the
419            interactor parameter anymore.
420    
421            * Thuban/UI/tableview.py (TableFrame.__init__)
422            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
423            (LayerTableFrame.row_selected): The interactor is gone. It's job
424            from the dialog's point of view is now done by the mainwindow,
425            i.e. the parent. Subscribe to SHAPES_SELECTED instead
426            of SELECTED_SHAPE
427            
428            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
429            is gone. It's job from the dialog's point of view is now done by
430            the mainwindow, i.e. the parent.
431            
432            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
433            gone. It's job from the dialog's point of view is now done by the
434            mainwindow, i.e. the parent.
435    
436            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
437            gone. It's job from the dialog's point of view is now done by the
438            mainwindow, i.e. the parent.
439            (SessionTreeCtrl.__init__): New parameter mainwindow which is
440            stored as self.mainwindow. The mainwindow is need so that the tree
441            can still subscribe to the selection messages.
442            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
443            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
444            selection is now accessible through the mainwindow. Subscribe to
445            SHAPES_SELECTED instead of SELECTED_SHAPE
446    
447            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
448            SHAPES_SELECTED message now.
449            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
450            so deal with multiple shapes
451            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
452            gone. It's job from the dialog's point of view is now done by the
453            mainwindow, i.e. the parent.
454    
455            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
456            parameter is now a list of shape ids.
457            (RecordTable.SetTable): The second parameter is now a list of
458            indices.
459    
460            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
461            selected_shape parameter and ivar to selected_shapes. It's now a
462            list of shape ids.
463            (MapRenderer.draw_label_layer): Deal with multiple selected
464            shapes. Rearrange the code a bit so that the setup and shape type
465            distinctions are only executed once.
466    
467            * test/test_selection.py: Test cases for the selection class
468    
469    2003-03-11  Jonathan Coles   <[email protected]>
470    
471            * Thuban/Model/load.py: Temporary fix so that the xml reader
472            doesn't cause Thuban to crash.
473    
474            * Thuban/Model/layer.py: Handle the cyclic references between
475            a layer and its classification better, and be sure to disconnect
476            the classification from the layer when the layer is destroyed
477            so that we don't maintain a cyclic reference that may not be
478            garbage collected.
479    
480            * Thuban/Model/classification.py: See comment for layer.py.
481    
482    2003-03-12  Jan-Oliver Wagner <[email protected]>
483    
484            * HOWTO-Release: New. Information on the steps for releasing
485            a new version of Thuban.
486    
487    2003-03-11  Jonathan Coles   <[email protected]>
488    
489            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
490            Use True instead of true.
491            (Classifier): Should have a single panel in which all the controls lie.
492    
493            * Thuban/UI/proj4dialog.py: Add normal border.
494    
495            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
496    
497            * Thuban/UI/mainwindow.py: Use True instead of true.
498    
499            * setup.py: Update some definitions to use wxWindows2.4 files
500    
501            * Data/iceland_sample_class.thuban: Fixed file so that the
502            field_type information is present.
503    
504    2003-03-10  Jonathan Coles   <[email protected]>
505    
506            * Thuban/UI/classifier.py (Classifier.__init__): Make the
507            field type label grow so that when the text changes the
508            size is updated correctly. This may be a wxWindows bug.
509    
510    2003-03-10  Jonathan Coles   <[email protected]>
511    
512            * Thuban/UI/application.py: Changed SESSION_CHANGED to
513            SESSION_REPLACED.
514    
515            * Thuban/UI/classifier.py: Wrap text with _().
516            (ClassGrid.CreateTable): Set dimensions and size hints here,
517            instead of in Reset, so we only set the size once.
518    
519            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
520    
521            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
522            Call Close() instead of Shutdown().
523    
524            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
525    
526            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
527            Go back to using OnClose() instead of Shutdown().
528    
529    2003-03-10  Jonathan Coles   <[email protected]>
530    
531            * Thuban/UI/classifier.py (Classifier): SelectField() needed
532            to know the old field index as well as the new one.
533    
534    2003-03-10  Jonathan Coles   <[email protected]>
535    
536            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
537            to correctly set the table information and call this from
538            __init__ and from _OnFieldSelect so that all the information
539            is up to date when the dialog opens and when a field is changed.
540    
541    2003-03-10  Jonathan Coles   <[email protected]>
542    
543            * Thuban/Model/classification.py (Classification): Don't use
544            layer's message function directly, use the ClassChanged() method
545            when then classification changes. SetField/SetFieldType/SetLayer
546            must keep the information about field name and field type in
547            sync when an owning layer is set or removed.
548    
549            * Thuban/Model/layer.py: Added ClassChanged() so that the
550            classification can tell the layer when its data has changed.
551            (Layer.SetClassification): Accepts None as an arguement to
552            remove the current classification and correctly handles
553            adding a new classification.
554    
555            * Thuban/Model/load.py: Comment out print statement
556    
557            * test/test_classification.py, test/test_save.py: New and
558            improved tests.
559    
560    2003-03-07  Jonathan Coles   <[email protected]>
561    
562            * Thuban/Model/classification.py: Implemented __copy__ and
563            __deepcopy__ for ClassGroup* and ClassGroupProperites so
564            they can easily be copied by the classifier dialog.
565            (ClassGroupProperites.__init__): The default line color should
566            have been Color.Black.
567    
568            * Thuban/UI/classifier.py: Setting and Getting table values now
569            uses a consistent set of functions.
570            (Classifier): Now non-modal. Has field type label which changes
571            as the field changes. Keep track of buttons in a list so that
572            we can enable/disable the buttons when the None field is selected.
573            (SelectPropertiesDialog): Add buttons to make the colors transparent.
574    
575            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
576            does what OnClose did, but can be called by the application to
577            close a window. Needed when a session changes, and we have to
578            close the classifier windows.
579    
580            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
581            Shuts down open dialogs. Used when a new session is created
582            or a session is opened.
583            (MainWindow.SaveSession): Should only call application.SaveSession()
584            if we don't call SaveSessionAs first.
585            (MainWindow.Classify): Allow different classifier dialogs for
586            different layers.
587    
588            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
589            the parent class handle it. Add Shutdown() to unsubscibe from
590            event notification and call the parent Shutdown(). This was
591            necessary so the application can close the tree window.
592    
593    2003-03-06  Jonathan Coles   <[email protected]>
594    
595            * Thuban/Model/classification.py: Minor documentation changes,
596            Addition of __eq__ and __ne__ methods.
597            (Classification.SetLayer): prevent recursion between this method
598            and Layer.SetClassification().
599    
600            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
601    
602            * Thuban/Model/layer.py (SetClassification): prevent recursion
603            between this method and Classification.SetLayer().
604    
605            * test/test_classification.py, test/test_load.py,
606            test/test_session.py: Fixed and added tests for the classification
607            classes.
608    
609    2003-03-06  Bernhard Herzog  <[email protected]>
610    
611            * Thuban/UI/classifier.py (ClassGrid.__init__)
612            (ClassGrid.CreateTable): Move the SetSelectionMode call to
613            CreateTable because otherwise it triggers an assertion in
614            wxPython/wxGTK 2.4.
615    
616    2003-03-05  Jonathan Coles   <[email protected]>
617    
618            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
619    
620            * Thuban/Model/load.py: import FIELDTYPE constants from table.
621    
622            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
623    
624            * Thuban/Model/table.py: Put FIELDTYPE constants back.
625    
626    2003-03-05  Jonathan Coles   <[email protected]>
627    
628            * Thuban/UI/classifier.py: Added class documentation.
629            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
630            Store just the groups in the table and generate the other
631            column information when it is requested. Add "None" field
632            to pull-down to select no classification.
633    
634            * Thuban/common.py: Moved FIELDTYPE constants from table.py
635            (Str2Num): Only catch ValueError exceptions.
636    
637            * Thuban/Model/classification.py: Class documentation. Renaming
638            of methods with Stroke to Line. Groups are stored in a single
639            list with the default as the first element. Groups are searched
640            in the order they appear in the list.
641    
642            * Thuban/Model/color.py: Documentation.
643    
644            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
645            the kind of data represented by a field.
646    
647            * Thuban/Model/load.py (ProcessSession): Use proper string
648            conversion function; fixes RTbug #1713.
649    
650            * Thuban/Model/save.py (Saver): Store field type information.
651    
652            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
653            (Table): Add field_info_by_name() to retrieve field information
654            by specifying the field name, not the number.
655    
656            * Thuban/UI/mainwindow.py: Function name changes.
657    
658            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
659            get the layer classification once. Don't try to classify
660            values when the field is None: just use the default properties.
661    
662            * Thuban/UI/view.py: Function name changes.
663    
664            * Doc/thuban.dtd: Add field_type attribute to a classification.
665    
666    2003-03-04  Bernhard Herzog  <[email protected]>
667    
668            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
669            the fill and stroke layer attributes optional with suitable
670            default values. Add the stroke_width layer attribute. Use correct
671            syntax for empty elements. Make the attribute list for labels
672            refer to the label element.
673    
674    2003-03-04  Bernhard Herzog  <[email protected]>
675    
676            * setup.py (thuban_build_py.build): Add a comment about distutils in
677            Python 2.3 containing some of the functionality we implement in
678            setup.py ourselves.
679    
680            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
681            before the selection mode. Doing it the other way round triggers
682            an assertion in wxWindows.
683    
684            * Thuban/Model/save.py (escape): Fix typo in doc-string
685    
686            * Thuban/Model/classification.py: Remove unnecessary wxPython
687            import
688    
689    2003-03-04  Jonathan Coles   <[email protected]>
690    
691            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
692            Parameter 'value' should default to None.
693    
694            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
695            the class attribute __classification is now private.
696    
697            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
698            Classifier to ClassGrid. Added support for removing selected rows,
699            which including code for keeping track of when cells are selected,
700            and deselected.
701            (ClassTable): Support for added/removing rows. Fixed a problem
702            with __ParseInput whereby it would not allow strings (only numbers)
703            to be entered.
704            (Classifier): Added button and supporting code for removing
705            selected rows.
706    
707    2003-02-27  Jonathan Coles   <[email protected]>
708    
709            * Thuban/common.py: Moved color conversion functions into
710            Thuban/UI/common.py.
711            (Str2Num): Now converts the float (not the string) to a long/int
712            so that an exception isn't thrown.
713    
714            * Thuban/UI/common.py: Common functions used in several UI modules
715    
716            * Thuban/Model/classification.py: Changed the class hierarchy
717            so that a Classification consists of Groups which return
718            Properties when a value matches a Group.
719    
720            * Thuban/Model/layer.py: Fixed name resolution problem.
721    
722            * Thuban/Model/load.py: Use new Classification and Group functions.
723    
724            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
725            failure.
726            (Saver.write_classification): Use new Classification and Group
727            functions.
728    
729            * Thuban/UI/classifier.py: Changes to use new Classification and Group
730            functions. Fix to create a tuple with a single value instead of
731            simply returning the value.
732    
733            * Thuban/UI/renderer.py: Use new Classification and Group functions.
734            Use common.py functions.
735    
736            * Thuban/UI/tree.py: Use common.py functions.
737            
738            * test/test_classification.py: Use new Classification and Group
739            classes.
740    
741    2003-02-24  Jonathan Coles   <[email protected]>
742    
743            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
744            functions from Thuban color objects to wxWindow colour objects.
745    
746            * Thuban/Model/classification.py (Classification): Renamed
747            GetProperties() to GetClassData(). Used the new iterator
748            in TreeInfo().
749            (ClassIterator): Iterator implementation to iterate over the
750            ClassData objects in a classification object.
751    
752            * Thuban/Model/save.py (Saver.write_classificaton): Uses
753            the new iterator to save the classification information.
754    
755            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
756            for changing the stroke and fill colors and previewing the
757            changes.
758    
759            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
760            MainWindow.SaveSessionAs): Text string changes so the dialogs
761            have more meaningful titles.
762    
763            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
764            Classification method name from GetProperties to GetClassData.
765    
766            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
767            instead of accessing now non-existent class variables.
768    
769    2003-02-24  Bernhard Herzog  <[email protected]>
770    
771            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
772            unneeded Shape() call. Rendering is substantially faster without
773            it and it avoids some problems with broken shape files.
774    
775    2003-02-20  Frank Koormann   <[email protected]>
776    
777            Force minimal size of identify and label dialogs. The autosizing
778            looked too ugly.
779    
780            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
781            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
782            Set size of listctrl.
783            * Thuban/UI/identifyview.py (IdentifyView.__init__):
784            Set size of dialog.
785    
786    2003-02-19  Jonathan Coles   <[email protected]>
787    
788            * test/test_classification.py, test/test_layer.py,
789            test/test_load.py, test/test_map.py, test/test_session.py:
790            Updated the tests to use the new functions that are in the
791            respective classes.
792    
793            * Thuban/Model/classification.py (Classification):
794            Uses the new ClassData* classes. Modification messages are
795            passed up to the parent layer (if it exists).
796            (ClassData): New class to encapsulate the common data in each
797            classification property.
798            (ClassDataDefault): Represents the Default class. data.
799            (ClassDataPoint): Represents a single class. data point
800            (ClassDataRange): Represents a class. range
801            (ClassDataMap): Represents a class. map (unused).
802    
803            * Thuban/Model/color.py: Added Color.None to represent something
804            with no color. Color.Black represents the color black.
805            (NoColor): Helper class derived from Color to represent something
806            with no color.
807    
808            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
809            stroke_width attributes. Made the 'classification' attribute private.
810            New methods for setting/getting the classification.
811    
812            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
813            to get the classifcation and use the new ClassData* classes to
814            hold the classification data. Use Str2Num to convert numbers
815            properly.
816    
817            * Thuban/Model/save.py (Saver): Use new Color and Classification
818            methods
819    
820            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
821            custom grid.
822            (ClassTable): Support for editing Values and Labels and for
823            changing what type (point or range) of data is stored in each
824            property based on how the user enters the data.
825            (Classifier): Support for saving the new classifications and
826            launching the dialog to edit a property.
827            (SelectPropertiesDialog): New class for editing the visual
828            properties of a classification (stroke color, width, and fill color)
829            (ClassPreviewer): Took the Draw method from ClassRenderer and
830            made most of it into this new class. Intend to use this class in
831            the SelectPropertiesDialog for previewing changes.
832    
833            * Thuban/UI/renderer.py: Use new Color and Classification methods.
834    
835            * Thuban/UI/tree.py: Formatting changes.
836    
837            * Doc/thuban.dtd: Add 'label' element
838    
839            * Thuban/common.py: New. Contains common routines used throughout
840            the code.
841            (Str2Num): Takes a string and converts it to the "best" type of
842            number.
843    
844    2003-02-14  Bernhard Herzog  <[email protected]>
845    
846            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
847            dragging flag is always set to 0 even when the tool implementation
848            raises an exception
849    
850    2003-02-11  Bernhard Herzog  <[email protected]>
851    
852            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
853            method to create a splash screen.
854            (ThubanApplication.ShowMainWindow): New. Show the main window.
855            Needed so the splash screen can display the mainwindow
856            (ThubanApplication.OnInit): Call the
857            new splash_screen method to determine whether the application
858            should display a splash screen. If it displays a splash screen do
859            not immediately show the main window.
860    
861    2003-02-11  Jonathan Coles  <[email protected]>
862    
863            * Thuban/Model/classification.py: Added import line to fix
864            feature conflicts between running on python2.2 and python2.1.
865    
866            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
867            onto the clinfo parameter, so removed the deepcopy().
868    
869    2003-02-10  Jonathan Coles  <[email protected]>
870    
871            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
872            Added element_open variable to track opening and closing of tags
873            so that tags that don't span more than one line are closed with
874            /> instead of </tag_name>. Use the GetDefault*() methods of
875            the Classification class.
876    
877            * Thuban/Model/classification.py (Classificaton): Added set and
878            get methods for the default data. The class also takes a layer
879            reference so that modification messages can be sent. Fixed the
880            methods to use the new ClassData class.
881            (ClassData): New class to encapsulate the classification data
882    
883            * Thuban/Model/layer.py (Layer): Remove the
884            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
885            SetDefault*() methods on the layer's classification object.
886            (Layer.__init__): Use the new SetDefault*() methods in the
887            Classification class.
888    
889            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
890            object instead of a dictionary.
891    
892            * Thuban/UI/classifier.py (ClassRenderer): New class to
893            draw the classifications in the dialog box's table.
894            (Classifier): Modified to use the ClassRenderer class.
895    
896            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
897            methods of the Classification class.
898    
899            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
900            of the ClassData class.
901    
902            * test/test_classification.py, test/test_layer.py,
903            test/test_map.py, test/test_session.py: Fix the tests to work
904            with the above code changes.
905    
906    2003-02-03  Jonathan Coles  <[email protected]>
907    
908            * Thuban/Model/classification.py (Classification): Added getNull()
909            to return the NullData reference
910    
911            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
912            Layer.SetStrokeWidth): Modified these functions to change the
913            null data in the classification rather than keep these values
914            directly in the Layer class. Menu options to change these values
915            work again.
916    
917    2003-01-28  Jonathan Coles  <[email protected]>
918    
919            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
920            Fixed crashing problem on some systems. Dialog box shows
921            classification data.
922    
923            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
924            Colors in the tree view.
925    
926            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
927            the tree info for classifications. Commented out unnecessary lines.
928    
929            * Thuban/Model/classification.py (Classification.TreeInfo): New
930            function to add information about the classification into the
931            tree view.
932    
933    2003-01-27  Jan-Oliver Wagner <[email protected]>
934    
935            * Thuban/__init__.py (_): New.
936    
937            * Thuban/Model/classification.py, Thuban/Model/extension.py,
938            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
939            Thuban/Model/session.py, Thuban/UI/application.py,
940            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
941            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
942            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
943            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
944            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
945    
946    2003-01-27  Jonathan Coles  <[email protected]>
947    
948            * Thuban/Model/layer.py: Classification initialization calls.
949    
950            * Thuban/Model/classification.py: Created class to encapsulate
951            a layer classification. Supports specific data points and
952            ranges.
953    
954            * Thuban/Model/load.py: Added support for loading classification
955            information.
956    
957            * Thuban/Model/save.py: Added support for saving classification
958            information.
959    
960            * Thuban/UI/classifier.py: Initial class for a dialog box for
961            specifying classification information.
962    
963            * Thuban/UI/mainwindows.py: Support for opening the classifier
964            dialog.
965    
966            * Thuban/UI/renderer.py: Support for drawing a layer with the
967            classification information.
968    
969            * Data/iceland_sample_class.thuban: iceland_sample with
970            classification data.
971    
972            * test/test_classification: Tests for the Classification class.
973    
974    2002-12-09  Bernhard Herzog  <[email protected]>
975    
976            * test/test_command.py: New. Tests for the command classes.
977    
978            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
979            (Command.IsTool): New method to distinguish between command
980            switching tools and other commands.
981    
982            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
983            the tool to avoid direct assignments to instance variables
984            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
985            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
986            change the tool
987    
988            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
989            active tool's command turns insensitive, disable the tool.
990            (_tool_command): Use the new ToolCommand class
991    
992            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
993            SelectTool method to change the tool
994            (iconfile): Use the ToolCommand class
995    
996    2002-12-03  Bernhard Herzog  <[email protected]>
997    
998            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
999            the case of selected items that are not children of Layers or Maps
1000            properly. Previously this bug would trigger an assertion in
1001            wxWindows.
1002    
1003    2002-11-06  Frank Koormann  <[email protected]>
1004    
1005            * Thuban/UI/mainwindow.py: Altered the order of tools in the
1006            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
1007            Full Extent).
1008    
1009    2002-10-23  Bernhard Herzog  <[email protected]>
1010    
1011            * setup.py (setup call): version now 0.1.3
1012    
1013            * MANIFEST.in: Add the files in test/
1014    
1015            * test/README: Add note about tests requiring the iceland data
1016    
1017            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
1018            copyright notice.
1019    
1020    2002-10-18  Bernhard Herzog  <[email protected]>
1021    
1022            * test/test_map.py
1023            (TestMapWithContents.test_projected_bounding_box): Use an explicit
1024            epsilon.
1025    
1026            * test/support.py (FloatComparisonMixin.assertFloatEqual)
1027            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
1028            message if the assertion fails and don't return the return value
1029            of self.assert_. In assertFloatSeqEqual the return meant that not
1030            all items of the sequence were compared.
1031    
1032    2002-09-20  Bernhard Herzog  <[email protected]>
1033    
1034            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
1035    
1036            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
1037    
1038            * test/test_map.py (TestMapWithContents.test_tree_info): Create
1039            the string with the bounding box on the fly because of platform
1040            differences in the way %g is handled.
1041    
1042            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
1043            DBFfile too because Thuban layers can't yet cope missing DBF
1044            files.
1045    
1046    2002-09-20  Bernhard Herzog  <[email protected]>
1047    
1048            * test/test_menu.py: Use initthuban instead of
1049            add_thuban_dir_to_path to initialize Thuban.
1050    
1051            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
1052            Mixin class for float comparisons
1053            (SubscriberMixin): New. Mixin class to test messages sent through
1054            the Connector class
1055    
1056            * test/README: Fix a typo and add the -v flag to the command for
1057            individual tests
1058    
1059            * test/test_session.py: New. Test cases for Thuban.Model.session
1060    
1061            * test/test_proj.py: New. Test cases for Thuban.Model.proj
1062    
1063            * test/test_map.py: New. Test cases for Thuban.Model.map
1064    
1065            * test/test_layer.py: New. Test cases for Thuban.Model.layer
1066    
1067            * test/test_label.py: New. Test cases for Thuban.Model.label
1068    
1069            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
1070    
1071            * test/test_color.py: New. Test cases for Thuban.Model.color
1072    
1073            * test/test_base.py: New. Test cases for Thuban.Model.base
1074    
1075    2002-09-13  Bernhard Herzog  <[email protected]>
1076    
1077            * Thuban/Model/session.py (Session.forwarded_channels): Forward
1078            the CHANGED channel too.
1079    
1080            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
1081            CHANGED channel too.
1082            (Map.__init__): Call the Modifiable constructor as well.
1083    
1084            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
1085            event if the modified flag changes.
1086            (Modifiable.changed): Tweak the doc-string.
1087    
1088            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
1089            (MainWindow.set_position_text): Put the code that puts the text
1090            with the mouse position into the status bar into the new method
1091            set_position_text so that it can overwritten in derived classes.
1092    
1093    2002-09-12  Bernhard Herzog  <[email protected]>
1094    
1095            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
1096            message box on the main window.
1097    
1098    2002-09-11  Bernhard Herzog  <[email protected]>
1099    
1100            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
1101            the 'E' because it's less likely to interfere with other menu
1102            entries.
1103            (MainWindow.build_menu): remove an incorrect comment.
1104    
1105    2002-09-10  Bernhard Herzog  <[email protected]>
1106    
1107            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
1108            (_tool_command): Add sensitive parameter
1109            (_has_visible_map): Sensitivity callback to tools and other
1110            commands that require a visible map. Use it in map_zoom_in_tool,
1111            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
1112            and map_full_extent
1113    
1114    2002-09-06  Bernhard Herzog  <[email protected]>
1115    
1116            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
1117            VIEW_POSITION
1118    
1119    2002-09-04  Frank Koormann  <[email protected]>
1120    
1121            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
1122    
1123    2002-09-02  Bernhard Herzog  <[email protected]>
1124    
1125            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
1126            wxWindows already and our implementation doesn't work correctly
1127            with wxGTK 2.3:
1128            (MapCanvas.__init__): Remove the instance variable
1129            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
1130            be drawin
1131            (MapCanvas.OnIdle): Removed.
1132    
1133            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
1134            a parameter to determine the size of the rectangle.
1135            (MapCanvas.find_shape_at): Create the box around the point on a
1136            layer by layer basis and make the size depend on the shape type.
1137            This solves a problem with the selection of point shapes at the
1138            border of the layer's bounding box
1139    
1140    2002-08-30  Bernhard Herzog  <[email protected]>
1141    
1142            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
1143            for the sensitivity  of remove layer.
1144            (_can_remove_layer): New. Sensitivity callback for remove layer
1145            (Command layer_remove): Use _can_remove_layer
1146    
1147            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
1148            determine whether a given layer can be deleted.
1149    
1150            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
1151            (MapCanvas.do_redraw): Get rid of the unused update_region
1152            instance variable
1153    
1154            * Thuban/UI/view.py: Add/update some doc-strings.
1155    
1156            * test/: new subdirectory with a bunch of unit tests.
1157    
1158            * test/README, test/test_table.py, test/test_save.py,
1159            test/test_menu.py, test/test_load.py: Initial set of tests and
1160            brief instructions on how to run them
1161    
1162    2002-08-29  Bernhard Herzog  <[email protected]>
1163    
1164            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
1165            arcs with multiple parts.
1166    
1167            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
1168            Handle degenrate rectangles.
1169    
1170            * Thuban/Model/table.py: Make writing records work correctly:
1171            (Table.__init__): Keep track of whether the DBF is open for
1172            writing
1173            (Table.write_record): Open the DBF file for writing when necessary
1174    
1175    2002-08-27  Bernhard Herzog  <[email protected]>
1176    
1177            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
1178            dbf files only for reading by default. Use a new writable dbf
1179            object for writing.
1180    
1181    2002-08-26  Bernhard Herzog  <[email protected]>
1182    
1183            * Thuban/UI/mainwindow.py: Refactor the context creation:
1184            (MainWindow.Context): New method to return a context
1185            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
1186            new method
1187    
1188            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
1189            layer table specific code from TableGrid into LayerTableGrid
1190            (TableFrame, LayerTableFrame): Split the layer table specific code
1191            from TableFrame into LayerTableFrame
1192            (LayerTableGrid.select_shape): Remove a debug print
1193    
1194            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
1195            LayerTableFrame
1196    
1197    2002-08-23  Bernhard Herzog  <[email protected]>
1198    
1199            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
1200            absolute filename.
1201    
1202  2002-08-22  Bernhard Herzog  <[email protected]>  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)          * Thuban/UI/mainwindow.py (make_check_current_tool)
1216          (_tool_command): Put the code that generates the "checked"          (_tool_command): Put the code that generates the "checked"
1217          callback into a separate function so that we can reuse it          callback into a separate function so that we can reuse it
# Line 29  Line 1241 
1241          * setup.py (ThubanInstall.run): Don't repr install_lib_orig          * setup.py (ThubanInstall.run): Don't repr install_lib_orig
1242          because thubaninit_contents will do it for us.          because thubaninit_contents will do it for us.
1243    
1244  2002-08-16      Jan-Oliver Wagner <[email protected]>  2002-08-16  Jan-Oliver Wagner <[email protected]>
1245    
1246          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
1247          tree window already open          tree window already open
# Line 157  Line 1369 
1369          * Thuban/UI/tree.py: We can now simply subscribe to the session's          * Thuban/UI/tree.py: We can now simply subscribe to the session's
1370          CHANGED channel to be informed of changes.          CHANGED channel to be informed of changes.
1371          (SessionTreeCtrl.session_channels): Not needed any longer.          (SessionTreeCtrl.session_channels): Not needed any longer.
1372          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
1373          Only have to (un)subscribe CHANGED          Only have to (un)subscribe CHANGED
1374    
1375          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
# Line 218  Line 1430 
1430          * Thuban/Model/layer.py (Layer.TreeInfo),          * Thuban/Model/layer.py (Layer.TreeInfo),
1431          Thuban/Model/extension.py (Extension.TreeInfo),          Thuban/Model/extension.py (Extension.TreeInfo),
1432          Thuban/Model/map.py (Map.TreeInfo),          Thuban/Model/map.py (Map.TreeInfo),
1433          Thuban/Model/session.py (Session.TreeInfo):          Thuban/Model/session.py (Session.TreeInfo):
1434          Add TreeInfo methods to implement the new tree view update scheme          Add TreeInfo methods to implement the new tree view update scheme
1435    
1436  2002-07-16  Bernhard Herzog  <[email protected]>  2002-07-16  Bernhard Herzog  <[email protected]>
# Line 299  Line 1511 
1511          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
1512          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
1513    
1514  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
1515    
1516          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
1517          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 528  Line 1740 
1740          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
1741          position in the statusbar          position in the statusbar
1742    
1743  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
1744    
1745          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
1746    
1747  2002-04-24      Frank Koormann <[email protected]>  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 653  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 770  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 787  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 854  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 904  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 941  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.271  
changed lines
  Added in v.623

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26