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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 317 - (hide annotations)
Thu Sep 12 18:46:09 2002 UTC (22 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 41525 byte(s)
update ChangeLog

1 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
2    
3     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
4     message box on the main window.
5    
6 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
7    
8     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
9     the 'E' because it's less likely to interfere with other menu
10     entries.
11 bh 315 (MainWindow.build_menu): remove an incorrect comment.
12 bh 313
13 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
14    
15     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
16     (_tool_command): Add sensitive parameter
17     (_has_visible_map): Sensitivity callback to tools and other
18     commands that require a visible map. Use it in map_zoom_in_tool,
19     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
20     and map_full_extent
21    
22 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
23    
24     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
25     VIEW_POSITION
26    
27 frank 306 2002-09-04 Frank Koormann <[email protected]>
28    
29     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
30    
31 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
32    
33 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
34     wxWindows already and our implementation doesn't work correctly
35     with wxGTK 2.3:
36     (MapCanvas.__init__): Remove the instance variable
37     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
38     be drawin
39     (MapCanvas.OnIdle): Removed.
40    
41 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
42     a parameter to determine the size of the rectangle.
43     (MapCanvas.find_shape_at): Create the box around the point on a
44     layer by layer basis and make the size depend on the shape type.
45     This solves a problem with the selection of point shapes at the
46     border of the layer's bounding box
47    
48 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
49    
50 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
51     for the sensitivity of remove layer.
52     (_can_remove_layer): New. Sensitivity callback for remove layer
53     (Command layer_remove): Use _can_remove_layer
54    
55     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
56     determine whether a given layer can be deleted.
57    
58 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
59     (MapCanvas.do_redraw): Get rid of the unused update_region
60     instance variable
61    
62 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
63    
64 bh 292 * test/: new subdirectory with a bunch of unit tests.
65    
66     * test/README, test/test_table.py, test/test_save.py,
67     test/test_menu.py, test/test_load.py: Initial set of tests and
68     brief instructions on how to run them
69    
70 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
71    
72 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
73     arcs with multiple parts.
74    
75 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
76     Handle degenrate rectangles.
77    
78 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
79     (Table.__init__): Keep track of whether the DBF is open for
80     writing
81     (Table.write_record): Open the DBF file for writing when necessary
82    
83 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
84    
85     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
86     dbf files only for reading by default. Use a new writable dbf
87     object for writing.
88    
89 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
90    
91 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
92     (MainWindow.Context): New method to return a context
93     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
94     new method
95    
96 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
97     layer table specific code from TableGrid into LayerTableGrid
98     (TableFrame, LayerTableFrame): Split the layer table specific code
99     from TableFrame into LayerTableFrame
100 bh 280 (LayerTableGrid.select_shape): Remove a debug print
101 bh 278
102     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
103     LayerTableFrame
104    
105 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
106    
107     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
108     absolute filename.
109    
110 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
111    
112 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
113     records.
114     (Table.__init__): Open the DBF file for writing too.
115    
116     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
117     into the underlying table.
118    
119     * extensions/shapelib/shapefil.h (DBFCommit),
120     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
121     commit any changes made to the DBF file.
122    
123 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
124     (_tool_command): Put the code that generates the "checked"
125     callback into a separate function so that we can reuse it
126     elsewhere
127    
128 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
129     session into an XML file. The main reason to introduce a class is
130     that applications built on Thuban can derive from it so that they
131     can save additional information in a session file.
132     (save_session): Delegate almost all the work to the Saver class.
133     Rename the filename argument to file because it may be a file like
134     object now.
135    
136     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
137     code. Remove the little test code which would be executed when the
138     module is run as a script which didn't work anymore since it can't
139     import the other Thuban modules.
140     (ProcessSession, load_session): Refactor the ProcessSession to
141     have one method for each element start and end tag so that derived
142     classes can easily override the processing of individual tags.
143     Also, always parse with namespaces enabled because applications
144     built on top of Thuban will likely use namespaces if they extend
145     the session file format.
146    
147 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
148    
149     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
150     because thubaninit_contents will do it for us.
151    
152 jan 265 2002-08-16 Jan-Oliver Wagner <[email protected]>
153    
154     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
155     tree window already open
156    
157 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
158    
159 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
160     with self.
161    
162     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
163     when we have actually captured it.
164    
165 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
166     shapefile and destroy the table.
167    
168     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
169    
170 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
171    
172 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
173     instance variable columns
174     (RecordTable.GetTypeName): row and col may be negative in some
175     cases.
176    
177 bh 254 * setup.py (InstallLocal.initialize_options)
178     (InstallLocal.finalize_options, InstallLocal.user_options): New
179     option create-init-file to build a thubaninit.py when running
180     install_local
181     (InstallLocal.run): Create the thubaninit.py module when requested
182     (thubaninit_contents): Split the template into several parts and
183     create a new function thubaninit_contents that creates the
184     contents of a thubaninit module.
185     (ThubanInstall.run): Use the new function to create the thubaninit
186     module.
187    
188 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
189    
190     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
191     cleanup.
192     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
193    
194     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
195     direct base class' Destroy method.
196    
197     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
198     layers.
199     (Map.Destroy): Destroy the label_layer as well and call the
200     inherited Desatroymethod first so that no more messages are
201     issued.
202     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
203     message if the stacking order actually has changed. Add
204     doc-strings.
205     (Map.BoundingBox): Correct the doc-string.
206     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
207     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
208    
209     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
210     all labels.
211    
212 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
213    
214     * Thuban/Model/map.py (Map.subscribe_layer_channels)
215     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
216     to a layer's channels into separate methods.
217     (Map.RemoveLayer, Map.AddLayer): Call the new methods
218     (Map.Destroy): Unsubscribe from a layer's channels before
219     destroying it.
220    
221     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
222     selected_layer parameter to searched_layer which is the layer to
223     search in.
224     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
225     search to that layer. Return the selected layer and shape.
226    
227     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
228     typo
229    
230 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
231    
232 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
233     Extend the doc string.
234     (ThubanApplication.subscribe_session)
235     (ThubanApplication.unsubscribe_session): New methods to
236     subscribe/unsubscribe to/from session channels.
237     (ThubanApplication.SetSession): Call the new methods here.
238     (ThubanApplication.maps_changed, ThubanApplication.set_map):
239     Renamed set_map to maps_changed. Its now a subscriber for
240     MAPS_CHANGED.
241    
242     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
243     x-coordinate in case of simple clicks
244    
245     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
246     don't pass it as a parameter
247    
248     * Thuban/Model/session.py (Session.RemoveMap): New
249    
250 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
251     window size into a parameter.
252    
253 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
254    
255 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
256     just commands.
257    
258 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
259     parameter list a bit to allow setting the window title and the
260     initial message in the status bar. Update the callers.
261    
262     * Thuban/UI/application.py (ThubanApplication.OnInit)
263     (ThubanApplication.CreateMainWindow): Put the mainwindow
264     instantiation into a separate method so that it can be overridden
265     by a subclass.
266    
267 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
268    
269 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
270     another changed message is issued to make it easier to get
271     notified of changes.
272     (Session): Update the doc string
273     (Session.forward): Issue changed-events as CHANGED as well.
274     (Session.changed): Overwrite the inherited version to issue
275     CHANGED events as well.
276    
277     * Thuban/UI/tree.py: We can now simply subscribe to the session's
278     CHANGED channel to be informed of changes.
279     (SessionTreeCtrl.session_channels): Not needed any longer.
280     (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
281     Only have to (un)subscribe CHANGED
282    
283     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
284    
285 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
286     for the wxPython locale bug to __init__.py so that it's
287     automatically executed by anybody using UI code from Thuban.
288    
289 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
290    
291 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
292    
293     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
294     as parameter and store it in an instance variable
295     (MainWindow.invoke_command, MainWindow.update_command_ui)
296     (MainWindow.save_modified_session, MainWindow.NewSession)
297     (MainWindow.OpenSession, MainWindow.SaveSession)
298     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
299     application object.
300    
301     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
302     the main window with self.
303    
304 bh 225 * Thuban/UI/context.py: New module with the context class
305    
306     * Thuban/UI/command.py (Command): Update doc string.
307    
308     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
309     MainWindow.update_command_ui): Pass an instance of the context
310     class to the command's methods
311     (check_current_tool, call_method): Handle the new context
312     implementation
313    
314     * Examples/simple_extensions/simple_tool.py (simple_tool,
315     check_simple_tool): Handle the new context implementation
316    
317     * Examples/simple_extensions/simple_command.py (simple_command):
318     Handle the new context implementation. Update the comments about
319     the context.
320    
321     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
322     doc-string
323     (ThubanApplication.Session): New method to return the session
324     object
325    
326     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
327     interactor's selected_layer may not be a layer of the current
328     session when the tree is updated while a new session is being set.
329    
330 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
331    
332     * Thuban/UI/tree.py (color_string): Removed. No longer used.
333     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
334     update_tree into update_tree and add_items. The tree now uses a
335     more generic way to display the contents of the tree.
336     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
337    
338     * Thuban/Model/layer.py (Layer.TreeInfo),
339     Thuban/Model/extension.py (Extension.TreeInfo),
340     Thuban/Model/map.py (Map.TreeInfo),
341     Thuban/Model/session.py (Session.TreeInfo):
342     Add TreeInfo methods to implement the new tree view update scheme
343    
344 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
345    
346     * Thuban/UI/application.py: Don't use "import from" for the
347     MainWindow. It can't always be resolved.
348     (ThubanApplication.OnInit): change reference to MainWindow
349     accordingly.
350    
351     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
352     completely
353    
354 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
355    
356     * setup.py (create_init_module): New configurable variable whose
357     default depends on the platform we're running on.
358     (ThubanInstall.initialize_options): Initialize
359     self.create_init_module from the global create_init_module
360     (ThubanInstall.user_options): indictate that the options
361     create-init-module and init-module-dir have arguments.
362    
363     * setup.py: In the setup call change the version number to include
364     cvs.
365    
366     * MANIFEST.in: Add the files in Examples
367    
368 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
369    
370 bh 210 * setup.py: In the setup call, use the thuban homepage as the
371     value of the url parameter.
372    
373 bh 208 * Examples: New subdirectory for examples.
374    
375     * Examples/simple_extensions/simple_tool.xpm,
376     Examples/simple_extensions/simple_tool.py,
377     Examples/simple_extensions/simple_command.py,
378     Examples/simple_extensions/README: Simple examples showing how to
379     add new commands and tools.
380    
381 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
382     bdist_rpm that we also have an install script.
383     (bdist_inno): Add 2002 to the copyright notice.
384    
385 bh 205 * setup.py: Create a file in python's site-packages directory to
386     make installation of Thuban as a library easier.
387     (ThubanInstall.user_options): Add two new options,
388     create-init-module and init-module-dir
389     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
390     filenames for installation in the default directories.
391     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
392     the inherited methods to capture some filenames before they're
393     transformed too much by distutils.
394     (ThubanInstall.run): Create the init module if requested.
395     (ThubanInstall.thuban_init_filename): New method to return the
396     full name of the init module.
397     (ThubanInstall.get_outputs): Append the filename of the init
398     module.
399    
400 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
401    
402 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
403     handle the prefix properly which means that the default for the
404     installation prefix should be /usr for RPMs and /usr/local when
405     doing a normal source install.
406     (bdist_rpm_install_script): Script to override the default install
407     commands in the specfile generated by the bdist_rpm command.
408     (thuban_bdist_rpm.user_options): Add a prefix option
409     (thuban_bdist_rpm.initialize_options): Init the prefix option.
410     Create the script files for the spec files as empty files here
411     (thuban_bdist_rpm._make_spec_file): Override the inherited method
412     to fill the script files with content.
413    
414 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
415     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
416     argument. save_session now automatically uses this version,
417     solving a problem when saving to a relative filename.
418    
419     * setup.py: In the setup call, make sure that the library
420     directories are under $prefix/lib not directly under $prefix.
421    
422 jan 199 2002-06-20 Jan-Oliver Wagner <[email protected]>
423    
424     * Thuban/Model/extension.py: new module to handle extension objects.
425     * Thuban/Model/messages.py: new messages for extensions.
426     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
427     Session.AddExtension): new for handling extensions.
428     Also some other minor changes to round up extension handling.
429     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
430     of Extension titles and title and names of its objects.
431    
432 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
433    
434     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
435 bh 202 the events for a command.
436 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
437     Call bind_command_events to bind the events. add_toolbar_command
438     can now bind events too so that it's possible to have commands
439     that are only available through the toolbar.
440     (MainWindow.init_ids): New instance variable events_bound to keep
441     track of for which commands events have been bound.
442    
443 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
444    
445     * Thuban/UI/menu.py: New module to build and manage menus.
446    
447     * Thuban/UI/mainwindow.py: Remove some unused imports.
448     (MainWindow.__init__, main_menu): move the definition of the main
449     menu from __init__ to the Menu instance main_menu.
450     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
451     build the menu bar and sub-menus from a menu description.
452    
453     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
454     startup file
455     (ThubanApplication.read_startup_files): New method to run
456     ~/.thuban/thubanstart.py
457    
458 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
459     Move the toolbar definition to the Menu instance main_toolbar.
460     (MainWindow.build_toolbar): New method to build the toolbar
461     similar to the build_menu methods
462    
463 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
464    
465 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
466     layer_outline_color. Fix it in the definition of the command too.
467    
468 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
469    
470 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
471    
472     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
473     in the docstring
474    
475 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
476    
477 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
478     when the shapefile is empty.
479     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
480     now return None for empty shapefiles. Update doc-strings.
481    
482     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
483     the layer's bbox being None.
484    
485     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
486     layer's bbox being None.
487    
488 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
489     necessary.
490     (MapCanvas.__init__): New instance variables, last_selected_layer
491     and last_selected_shape to determine how the selection has
492     changed.
493    
494     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
495     AutoSizeColumns because it will cause a traversal of the entire
496     table which for large .dbf files will take a very long time.
497    
498 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
499    
500     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
501     maximum depth for the tree than shapelib does by default.
502    
503 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
504    
505     * setup.py (py_modules): The shptree modules doesn't have a
506     wrapper, so don't include it in the py_modules
507    
508 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
509    
510     * extensions/shapelib/shptree.c (compare_ints): Make arguments
511     const void * as in the qsort prototype
512     (SHPTreeFindLikelyShapes): Remove some unused variables.
513    
514     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
515     maintains to redraw the window during a drag.
516     (MapCanvas.unprojected_rect_around_point): New method to determine
517     a small region around a point for hit-testing.
518     (MapCanvas.find_shape_at): Only test the shapes in a small region
519     around the point.
520    
521     * setup.py: Increment the version to 0.1.2
522    
523     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
524     debug print and set session to None after unsubscribing
525    
526 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
527    
528 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
529     the file to have a .thuban extension.
530    
531 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
532     all the session channels to subscribe to to update the tree
533     (SessionTreeCtrl.session_changed): Remember the session so that we
534     can unsubscribe properly. Use the new class constant to
535     unsubscribe from the old session and subscribe to the new one.
536     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
537     subscriptions of the SessionTreeCtrl.
538     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
539    
540     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
541     Session Tree" command to the file menu.
542    
543     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
544     as update_region to the renderer.
545    
546     * Thuban/UI/renderer.py
547     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
548     update box is now directly a tuple, not a wxRect anymore.
549    
550     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
551     prints.
552    
553     2002-05-07 Bernhard Herzog <[email protected]>
554    
555 bh 146 * setup.py: Add the shptree extension module. See
556     extensions/pyshapelib/ChangeLog for more details.
557    
558     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
559     extensions/shapelib/dbfopen.c: Really update to the versions of
560     shapelib 1.2.9. For some reason it wasn't really done on
561     2002-04-11.
562    
563     * extensions/shapelib/shptree.c: Modified version of shptree.c of
564     shapelib 1.2.9. The only real difference is the use of qsort
565     instead of a bubble sort implementation
566    
567     * Thuban/Model/layer.py (Layer.__init__): New instance variable
568     shapetree to hold the shapelib quadtree for the shapefile
569     (Layer.open_shapefile): Create the quad tree.
570     (Layer.ShapesInRegion): New method to return the ids of shapes in
571     a given region using the quad tree.
572    
573     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
574     comment
575     (draw_polygon_shape): Accept both arcs and polygons.
576     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
577     the api.
578    
579     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
580     return the shape ids to be rendered in a given layer.
581     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
582     ids. Use draw_polygon_shape to draw arc shapes as well.
583     (ScreenRenderer.RenderMap): New parameter for the rectangle that
584     has to be updated
585     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
586     calling it's ShapesInRegion method.
587    
588     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
589     update_region for the update region.
590     (MapCanvas.OnPaint): Maintain the update region
591     (MapCanvas.do_redraw): Pass the bounding box of the update_region
592     to the renderer when drawing the bitmap. Reset the update_region.
593    
594 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
595    
596 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
597     MainWindow.OpenSession): Change the file extension of the session
598     files to .thuban
599    
600 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
601     Move the map channels to be forwarded by the session into the
602 bh 146 class constant with forwarded_channels. Also add
603     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
604     forwarded_channels
605 bh 129
606     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
607     typo and some rewording).
608    
609 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
610    
611     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
612     around to speed up most redraws:
613     (MapCanvas.__init__): New instance variable bitmap which holds the
614     bitmap
615     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
616     self.bitmap to draw.
617     (MapCanvas.full_redraw): New method to force a full redraw
618     including the bitmap
619     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
620     make sure the bitmap is redrawn.
621     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
622     MapCanvas.shape_selected): Call full_redraw instead of readraw to
623     make sure the bitmap is redrawn.
624     (MapCanvas.OnSize): New method to handle size events so that the
625     bitmap can be redrawn.
626    
627 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
628    
629     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
630     canvas' VIEW_POSITION event
631     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
632     Update the text in the status-bar accordingly.
633    
634     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
635     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
636     called.
637     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
638     current_position
639     (MapCanvas.set_current_position): New method to set
640     current_position. Issue a VIEW_POSITION event
641     (MapCanvas.CurrentPosition): New public method to return the value
642     of current_position. Should be called when the VIEW_POSITION event
643     is processed.
644     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
645     Update the position.
646     (MapCanvas.OnLeaveWindow): Set the position to None.
647    
648     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
649     position in the statusbar
650    
651 frank 120 2002-04-26 Frank Koormann <[email protected]>
652    
653     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
654    
655     2002-04-24 Frank Koormann <[email protected]>
656 frank 118
657     * Resources/Bitmaps/identify.xpm: shadow added
658    
659     * Resources/Bitmaps/fullextent.xpm: new
660    
661 jan 116 2002-04-22 Jan-Oliver Wagner <[email protected]>
662    
663     * Thuban/UI/tree.py (update_tree): added test for None on map bounding box
664    
665 jan 114 2002-04-21 Jan-Oliver Wagner <[email protected]>
666    
667     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
668    
669     * Thuban/UI/tree.py (update_tree): added added map extent
670    
671     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
672     icon; added map_full_extend as tool
673    
674 jan 107 2002-04-19 Jan-Oliver Wagner <[email protected]>
675    
676     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
677     saving _new_ sessions
678    
679     * Thuban/Model/session.py (create_empty_session): new session
680     don't have a filename (set to None)
681    
682     * Thuban/UI/tree.py (update_tree): added filename and modified flag
683    
684     * Thuban/Model/load.py (ProcessSession): convert projection
685     parameters from unicode to regular string
686    
687     * Data/iceland_sample.session: Added UTM Zone 26 projection.
688    
689 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
690    
691     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
692     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
693     1.2.9
694    
695     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
696     the pyshapelib directoy into the list of include dirs, so that
697     pyshapelib_api.h can be found.
698    
699     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
700     holds the pyshapelib C-API
701     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
702     pyshapelib_api to access the shapelib functions.
703     (initwxproj): Import the c_api from the shapelib module and
704     initialize pyshapelib_api.
705    
706 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
707    
708 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
709     initialize_options to create the scripts for the rpm.
710    
711 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
712    
713 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
714    
715 bh 87 * setup.py: Increment version to 0.1.1
716    
717 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
718     Layer" and "Remove Layer" commands from the layer menu to the map
719     menu
720    
721 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
722    
723     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
724     argument (python <= 1.5.2 erroneously accepted multiuple
725     arguments)
726    
727 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
728    
729     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
730     RecordGrid in the identifyview.
731     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
732     IdentifyListCtrl. The grid allows editing of the values.
733    
734     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
735     implementing a grid for a single row of a thuban table.
736    
737     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
738     layers by default. Easier to use than the previous default of only
739     searching through the select layer which meant that if no layer
740     was selected, you couldn't select a shape.
741    
742     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
743    
744     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
745     stroke_width attribute
746    
747     * Thuban/Model/save.py (save_session): Write the new stroke_width
748     attribute
749    
750     * Thuban/Model/load.py (ProcessSession.startElement): Read the
751     stroke_width attribute
752    
753     * Thuban/Model/layer.py (Layer.__init__): New parameter and
754     instance variable stroke_width
755     (Layer.SetStrokeWidth): Set the stroke_width.
756    
757 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
758    
759     * extensions/thuban/wxproj.cpp (project_points): Fix two
760     off-by-one errors in the last loop that joins the various parts
761     together.
762    
763 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
764    
765     * setup.py (data_dist.make_distribution): Fix some typos
766    
767 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
768    
769     * README: Slight tweaking in preparation for the 0.1 release
770    
771     * setup.cfg: Add section for sdist to create both tgz and zip
772     archives
773    
774     * setup.py: increase version number to 0.1
775     (data_dist): New command class for data distribution
776    
777    
778 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
779    
780 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
781     Handle the case of no layer (i.e. layer is None) properly.
782    
783     * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
784     Set the initial selection of the combo boxes to reflect the
785     projection we're starting with in a way that works on windows,
786     too.
787    
788 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
789     puiblisher's ids in hex to make it easier to compare them to the
790     standard repr of python methods
791    
792     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
793     messages
794    
795 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
796    
797 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
798     deselect the layer if no layer is selected
799    
800 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
801     idle time when there actually is something to draw. If there's
802     nothing to draw simply clear the window
803     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
804     (MapCanvas.SetMap): force a redraw in all cases because
805     FitMapToWindow doesn't always do it.
806     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
807     specify the point to move into the center of the window
808     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
809     dragged, zoon in/out by a factor of 2
810 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
811     index, i.e. reversed drawing order) so that objects appearing to
812     be in from of others are selected first. This is probably mostly
813     relevant for point shapes where the symbols used may overlap
814 bh 59
815     * Thuban/Model/session.py (create_empty_session): Unset the
816     modified bit before returning it
817    
818     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
819     create_empty_session session to create the new, empty session.
820    
821     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
822     the tool bitmaps.
823     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
824     the code that asks whether the session should be saved into the
825     new method save_modified_session.
826     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
827     method to save modified session here too.
828    
829 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
830    
831     * setup.py (InnoIconItem): fix typo
832    
833     (thuban_bdist_inno.run):
834     (bdist_inno.run): Move the decision not to create symlinks on
835     non-nt platforms to thuban_bdist_inno and do it unconditinally
836     since we never want to create the symlinks here
837    
838 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
839    
840 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
841     identify view immediately
842    
843     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
844     and SelectableRecordListCtrl that implement the code shared by the
845     identify view and the label dialog
846    
847     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
848     new class RecordListCtrl
849    
850     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
851     return value of GetValue is None instead of using it as a boolean
852     directly so that Zero numbers are handled properly.
853     (LabelListCtrl): Derive from the new class
854     SelectableRecordListCtrl
855    
856 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
857     (Proj4Dialog.dialogLayout): Make the window resizable and set the
858     size of the text control explicitly to make the sizers work on
859     both Windows and X.
860    
861 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
862    
863     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
864     that can limit the search to the currently selected layer.
865     (MapCanvas.SelectShapeAt): Make sure that the currently selected
866     layer stays selected even when no shape is found
867 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
868     height do nothing (avoids zero division errors)
869 bh 44
870 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
871    
872 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
873     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
874     convenient :-)
875     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
876     a new instvar layer_to_item to map layers to tree items
877     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
878     to match the current selection in the interactor
879    
880 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
881     (Interactor.HasSelectedLayer): New methods to query the current
882     selection
883    
884     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
885     (MainWindow.has_selected_layer): Simply call the appropriate
886     interactor method
887    
888     * Thuban/UI/mainwindow.py (MainWindow.__init__):
889     (MainWindow.LayerShowTable):
890     (MainWindow.identify_view_on_demand): Store the interactor in an
891     instvar and use that reference instead of going through main.app
892    
893     * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
894     * Thuban/UI/application.py (ThubanApplication.OnInit):
895     * Thuban/UI/main.py (main): Create the session tree view in main
896     with the new mainwindow method ShowSessionTree and not directly
897     the application's OnInit method
898    
899     * Thuban/UI/tree.py (myTreeCtrlPanel):
900     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
901     TreeCtrl isntead of a panel. This affects most method since we now
902     refer to self instead of self.tree
903     (SessionTreeView): New class implementing a non-modal dialog
904     showing the session tree.
905    
906 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
907     layer to the tableview dialog.
908    
909     * Thuban/UI/tableview.py: Add some doc-strings
910     (TableGrid):
911     (TableGrid.OnRangeSelect):
912     (TableGrid.OnSelectCell):
913     (TableFrame.__init__):
914     (TableFrame.row_selected):
915     Selecting rows in the grid view now updates the selected shapes
916     through the TableFrame. To achieve this we derive TableGrid from
917     Publisher and introduce the message type ROW_SELECTED which the
918     TableFrame subscribes to and which is issued by OnRangeSelect and
919     OnSelectCell
920    
921     (DataTable.SelectRow): Removed because it's no longer needed in
922     the row/shape selection scheme
923    
924 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
925     dialogs
926    
927     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
928     the SELECTED_SHAPE message anymore. This is now handled by the
929     parent.
930     (TableGrid.select_shape): Only update the selection if the shape
931     is not None.
932     (TableFrame): Inherit from the new NonModalDialog class.
933     (TableFrame.__init__, TableFrame.select_shape): Handle the
934     SELECT_SHAPE message.
935     (TableFrame.OnClose): Extend the inherited method to unsubscribe
936     SELECT_SHAPE
937    
938     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
939     (MainWindow.add_dialog):
940     (MainWindow.dialog_open):
941     (MainWindow.remove_dialog):
942     (MainWindow.get_open_dialog): New methods to maintain a dictionary
943     of opened non-modal dialogs.
944    
945     (MainWindow.__init__): Initialize the new non-modal dictionary
946     management code
947     (MainWindow.LayerShowTable): maintain separate dialogs for each
948     table using the non-modal dialog management code to only open a
949     view once for each table.
950    
951     (MainWindow.IdentifyTool):
952     (MainWindow.__init__):
953     (MainWindow.identify_view_on_demand): Don't open the identify view
954     in IdentifyTool anymore. This will be done automatically by the
955     new method identify_view_on_demand which handles the
956     SELECTED_SHAPE message so that the identify view will be opened on
957     demand
958    
959     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
960     the interactor argument. The SELECTED_SHAPE message is now handled
961     by the parent.
962     (IdentifyView.__init__): Add the interactor argument so that we
963     can handle the SELECTED_SHAPE message here
964     (IdentifyView.selected_shape): New method to handle the
965     SELECTED_SHAPE messages
966    
967     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
968     NonModalDialog class
969     (IdentifyView.OnClose): Extend the inherited version to
970     unsubscribe SELECT_SHAPE
971    
972     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
973    
974 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
975    
976     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
977    
978     * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
979     interactor to pass through to the MapCanvas
980    
981     * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
982     argument to the MainWindow constructor to get rid of the ugly hack
983     that made main.app available early just so that the mapcanvas
984     could access the interactor object.
985    
986 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
987    
988 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
989     that runs a modal message box
990     (MainWindow.OnClose): Use the new method
991     (MainWindow.RemoveLayer): Just do nothing in case no layer is
992     selected. The command should be grayed out anyway, so there's no
993     need to pop up a message box.
994     (MainWindow.AddLayer): Pop up a message box with an error message
995     if the shape file can't be opened
996    
997     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
998     immediately. This will cause an exception in case the file can't
999     be opened and we can display an appropriate message.
1000    
1001 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
1002    
1003     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
1004     specific bdist_rpm command.
1005    
1006     * Thuban/UI/main.py: Catch ImportError exceptions when importing
1007     the locale module because it may not be available on some
1008     installations.
1009    
1010     * extensions/pyprojection/LICENSE: Copy of the license text in
1011     Projection.i. Having it in a separate file makes it easier to
1012     refer to license text in e.g. RPMs
1013    
1014 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
1015    
1016 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
1017     more generic
1018    
1019     * setup.py (ThubanInstall.get_outputs): Add the symlink in
1020     <prefix>/bin to the outputs
1021     (ThubanInstall.link_file): New method to link files. We need this
1022     because the standard copy_files refuses to link non-existing
1023     files.
1024     (ThubanInstall.run): Remove the leading install root from the
1025     script filename if an install root was specified and use the new
1026     link_file method
1027    
1028 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
1029     the window when the first layer is added to the map.
1030    
1031     * setup.py (ThubanInstall.run): Honor the build root (self.root)
1032     when linking thuban.py to <prefix>/bin
1033    
1034 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
1035    
1036     * setup.py: In the setup call, the install parameters shouldn't
1037     have trailing slashes because distutils on non-posix platforms
1038     doesn't like that. The same applies to other directories like
1039     "Resources/Bitmaps"
1040    
1041     In the configuration section for nt, move the wxWindows directory
1042     optins into the part clearly marked as editable.
1043    
1044     (InstallLocal.initialize_options):
1045     (InstallLocal.user_options): remove the currently unused debug
1046     flag
1047     (thuban_build_py.find_all_modules): Add this method so that it
1048     works for our case of having packages and modules in one
1049     distribution as well.
1050     (ThubanInstall.initialize_options):
1051     (ThubanInstall.finalize_options):
1052     (ThubanInstall.user_options):
1053     (ThubanInstall.boolean_options): Add new options, do-symlink and
1054     extra files. Since these are the first ThubanInstall specific
1055     options, override user_options and boolean_options
1056     (ThubanInstall.run): Honor the new do-symlink and extra-files
1057     options.
1058     (ThubanInstall.get_outputs): Add to override the base-class's
1059     version and add the extra-files to the outputs
1060     (bdist_inno): New class for windows distributions with Inno Setup
1061     (InnoIconItem): Helper class for bdist_inno
1062     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
1063     this together with the appropriate parameters, to the setup call.
1064    
1065     * setup.cfg (bdist_inno): added new section for the inno setup
1066     installer
1067    
1068     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
1069     changing_selection to avoid recursive selection events when
1070     modifying the selection in response to a selection event.
1071     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
1072     changing the tree's selection.
1073     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
1074     we're not being called indirectly from normalize_selection.
1075    
1076     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
1077     event.Check only if the command is actuall checkable.
1078     (MainWindow.__init__): Call the toolbar's Realize method to make
1079     sure that the items are actually shown
1080    
1081 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
1082    
1083 bh 9 * setup.py: Fix some doc strings
1084    
1085 bh 7 * ChangeLog: started
1086    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26