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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 338 - (show annotations)
Fri Sep 20 16:26:31 2002 UTC (22 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 43500 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26