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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 593 - (show annotations)
Wed Apr 2 18:26:22 2003 UTC (21 years, 11 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 76805 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26