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

Legend:
Removed from v.18  
changed lines
  Added in v.497

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26