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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 341 - (show annotations)
Fri Sep 20 17:33:13 2002 UTC (22 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 43627 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26