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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 523 - (show annotations)
Wed Mar 12 17:08:23 2003 UTC (22 years ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 64270 byte(s)
added a HOWTO on releasing

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26