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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 505 - (show annotations)
Mon Mar 10 15:48:17 2003 UTC (21 years, 11 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 63563 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26