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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 723 - (show annotations)
Thu Apr 24 15:31:53 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 103129 byte(s)
First step towards table management. Introduce a simple data
abstraction so that we replace the data a layer uses more easily
in the next step.

* Thuban/Model/data.py: New file with a simple data abstraction
that bundles shapefile and dbffile into one object.

* Thuban/Model/session.py (Session.OpenShapefile): New method to
open shapefiles and return a shape store object

* Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
object instead of a shapefile filename. This introduces a new
instance variable store holding the datastore. For intermediate
backwards compatibility keep the old instance variables.
(open_shapefile): Removed. No longer needed with the shape store.
(Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
get the shape store used by a layer.
(Layer.Destroy): No need to explicitly destroy the shapefile or
table anymore.

* Thuban/UI/mainwindow.py (MainWindow.AddLayer)
(MainWindow.AddLayer): Use the session's OpenShapefile method to
open shapefiles

* Thuban/Model/load.py (ProcessSession.start_layer): Use the
session's OpenShapefile method to open shapefiles

* test/test_classification.py
(TestClassification.test_classification): Use the session's
OpenShapefile method to open shapefiles and build the filename in
a more platform independed way

* test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
Implement to have a session to use in the tests
(TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
(TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
session's OpenShapefile method to open shapefiles
(TestLayerLegend.setUp): Instantiate a session so that we can use
it to open shapefiles.
(TestLayerLegend.tearDown): Make sure that all references to
layers and session are removed otherwise we may get a resource
leak

* test/test_map.py (TestMapAddLayer.test_add_layer)
(TestMapWithContents.setUp): Instantiate a session so that we can
use it to open shapefiles.
(TestMapWithContents.tearDown): Make sure that all references to
layers, maps and sessions are removed otherwise we may get a
resource leak
("__main__"): use support.run_tests() so that more info about
uncollected garbage is printed

* test/test_save.py (SaveSessionTest.testSingleLayer): Use the
session's OpenShapefile method to open shapefiles
("__main__"): use support.run_tests() so that more info about
uncollected garbage is printed

* test/test_selection.py (TestSelection.tearDown): Make sure that
all references to the session and the selection are removed
otherwise we may get a resource leak
(TestSelection.get_layer): Instantiate a session so that we can
use it to open shapefiles.
("__main__"): use support.run_tests() so that more info about
uncollected garbage is printed

* test/test_session.py (TestSessionBase.tearDown)
(TestSessionWithContent.tearDown): Make sure that all references
to the session and layers are removed otherwise we may get a
resource leak
(TestSessionWithContent.setUp): Use the session's OpenShapefile
method to open shapefiles

1 2003-04-24 Bernhard Herzog <[email protected]>
2
3 First step towards table management. Introduce a simple data
4 abstraction so that we replace the data a layer uses more easily
5 in the next step.
6
7 * Thuban/Model/data.py: New file with a simple data abstraction
8 that bundles shapefile and dbffile into one object.
9
10 * Thuban/Model/session.py (Session.OpenShapefile): New method to
11 open shapefiles and return a shape store object
12
13 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
14 object instead of a shapefile filename. This introduces a new
15 instance variable store holding the datastore. For intermediate
16 backwards compatibility keep the old instance variables.
17 (open_shapefile): Removed. No longer needed with the shape store.
18 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
19 get the shape store used by a layer.
20 (Layer.Destroy): No need to explicitly destroy the shapefile or
21 table anymore.
22
23 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
24 (MainWindow.AddLayer): Use the session's OpenShapefile method to
25 open shapefiles
26
27 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
28 session's OpenShapefile method to open shapefiles
29
30 * test/test_classification.py
31 (TestClassification.test_classification): Use the session's
32 OpenShapefile method to open shapefiles and build the filename in
33 a more platform independed way
34
35 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
36 Implement to have a session to use in the tests
37 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
38 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
39 session's OpenShapefile method to open shapefiles
40 (TestLayerLegend.setUp): Instantiate a session so that we can use
41 it to open shapefiles.
42 (TestLayerLegend.tearDown): Make sure that all references to
43 layers and session are removed otherwise we may get a resource
44 leak
45
46 * test/test_map.py (TestMapAddLayer.test_add_layer)
47 (TestMapWithContents.setUp): Instantiate a session so that we can
48 use it to open shapefiles.
49 (TestMapWithContents.tearDown): Make sure that all references to
50 layers, maps and sessions are removed otherwise we may get a
51 resource leak
52 ("__main__"): use support.run_tests() so that more info about
53 uncollected garbage is printed
54
55 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
56 session's OpenShapefile method to open shapefiles
57 ("__main__"): use support.run_tests() so that more info about
58 uncollected garbage is printed
59
60 * test/test_selection.py (TestSelection.tearDown): Make sure that
61 all references to the session and the selection are removed
62 otherwise we may get a resource leak
63 (TestSelection.get_layer): Instantiate a session so that we can
64 use it to open shapefiles.
65 ("__main__"): use support.run_tests() so that more info about
66 uncollected garbage is printed
67
68 * test/test_session.py (TestSessionBase.tearDown)
69 (TestSessionWithContent.tearDown): Make sure that all references
70 to the session and layers are removed otherwise we may get a
71 resource leak
72 (TestSessionWithContent.setUp): Use the session's OpenShapefile
73 method to open shapefiles
74
75 2003-04-24 Jonathan Coles <[email protected]>
76
77 * Thuban/Model/load.py (XMLReader.read): Should have been checking
78 if the file_or_filename object had the 'read' attribute.
79
80 2003-04-23 Jonathan Coles <[email protected]>
81
82 * Thuban/Model/resource.py: Fixes RTbug #1813.
83 (ReadProjFile): Add documentation about which exceptions are raised.
84 Always pass the exceptions up to the caller.
85 (GetProjFiles): If the directory can't be read return an empty list.
86 If any of the proj files can't be read skip that file and go
87 on to the next one.
88
89 * test/test_proj.py: Added test cases to handle nonexistent files,
90 unreadable files, and files that don't parse correctly.
91
92 2003-04-23 Jonathan Coles <[email protected]>
93
94 Projection dialog. Allows the user to select from a list
95 of projection templates and optionally edit them and save new ones.
96
97 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
98 (ProjPanel): Base class for projection specific panels.
99 (TMPanel): Projection panel for Transverse Mercartor.
100 (UTMPanel): Projection panel for Universal Transverse Mercartor.
101 (LCCPanel): Projection panel for Lambert Conic Conformal.
102 (GeoPanel): Projetion panel for Geographic Projection.
103
104 2003-04-23 Jonathan Coles <[email protected]>
105
106 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
107 promote symmetry. There now exists XMLReader and XMLWriter.
108 (XMLReader.read): New. Call to read the given file descriptor or
109 filename.
110 (XMLReader.close): New. Make sure the file is closed.
111 (XMLReader.GetFileName): New. Return just the file name that is being
112 read from.
113 (XMLReader.GetDirectory): New. Return just the directory of the file
114 that is being read.
115 (XMLReader.AddDispatchers): New. Take a dictionary which contains
116 the names of functions to call as the XML tree is parsed.
117 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
118 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
119 (SessionLoader): Removed class variables start_dispatcher and
120 end_dispatcher since this functionality is now part of a class
121 instance. Fixes RTbug #1808.
122 (SessionLoader.__init__): Add dispatcher functions.
123 (load_xmlfile): Code was moved into the XMLReader.read().
124 (load_session): Use modified SessionLoader.
125
126 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
127 map's projection.
128
129 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
130 GetAllParameters.
131 (Projection.GetParameter): Returns the value for the given parameter.
132
133 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
134 (GetProjFiles): Renamed from GetProjections. Now returns a list
135 of ProjFile objects.
136 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
137 a list of ProjFile objects whose files are not user defined.
138 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
139 list of ProjFile objects whose files are user defined.
140 (ProjFileReader): Extend new XMLReader.
141
142 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
143 promote symmetry.
144
145 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
146 control instead of a wxComboBox. wxChoice controls do not generate
147 events as the uses highlights possible choices which fixes problems
148 with resizing the dialog when the use selects an option.
149
150 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
151 control instead of a wxComboBox.
152
153 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
154 dialog.
155
156 * test/test_proj.py (TestProjection.test): New tests for GetParameter
157 method.
158
159 2003-04-22 Bernhard Herzog <[email protected]>
160
161 * Thuban/UI/mainwindow.py: Remove some unused imports and global
162 constants
163
164 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
165 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
166
167 2003-04-17 Bernhard Herzog <[email protected]>
168
169 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
170 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
171 anymore.
172 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
173 (Layer.ShapeType, Layer.Shape): No need to call
174 self.open_shapefile since it's always called in __init__
175
176 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
177 In wxPython 2.4 there's no need to extend MainLoop anymore since
178 wxPython itself makes sure OnExit is called.
179
180 2003-04-16 Jonathan Coles <[email protected]>
181
182 Initial putback of projection management code. Includes new
183 classes to read and write projection files. The current load
184 and save classes were abstracted a bit so they could be reused.
185 The Projection class was extended to provide new methods and
186 have a name.
187
188 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
189 general XML reading methods that were part of ProcessSession.
190
191 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
192 name.
193 (ProjFile): New. Represents a file that contains projection
194 information.
195
196 * Thuban/Model/resource.py: New. Contains general utilities
197 for read and writing projection files.
198
199 * Thuban/Model/save.py (XMLSaver): New. Contains all the
200 general XML writing methods that were part of SessionSaver.
201 (SessionSaver): Renamed from Saver.
202
203 * test/test_proj.py: New test cases for the projection
204 file read and write functions.
205
206 2003-04-16 Jonathan Coles <[email protected]>
207
208 * Thuban/Model/classification.py: Use repr() around values
209 in the ClassGroup*.__repr__() methods so it is clearer when
210 a value is a string and when it is a number.
211
212 * test/test_load.py: Rework the classification test to test
213 that we can load old files.
214 (testLabels): Test a file where the groups have labels.
215
216 2003-04-16 Bernhard Herzog <[email protected]>
217
218 Safer implementation of the performance enhancements of the
219 low-level renderer:
220
221 * extensions/thuban/wxproj.cpp (extract_projection)
222 (extract_pointer): Rename extract_projection to extract_pointer
223 and redefine its purpose to return the pointer stored in a CObject
224 returned by the object's cobject method. Update all callers.
225 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
226 handling of these low-level parameters so that each s_draw_info
227 instance is handled as a CObject at python level that also
228 contains real references to the actual python objects which
229 contain the values in the struct. Add free_draw_info as the
230 destructor.
231 (draw_polygon_shape): Add the py_draw_info parameter which must a
232 cobject containing an s_draw_info pointer.
233
234 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
235 method to instantiat the low-level render parameter
236 (MapRenderer.draw_shape_layer): Use the new method. Remove some
237 commented out code.
238 (MapRenderer.draw_polygon_shape): Make the first parameter not the
239 layer but the low-level render parameter
240 (ScreenRenderer.draw_shape_layer): Use the low-level render
241 parameter.
242
243 2003-04-15 Jonathan Coles <[email protected]>
244
245 * Thuban/Model/classification.py: Implemented __repr__ for
246 the ClassGroup* classes to make debugging a bit easier.
247 (ClassGroup.SetLabel): Check that the string is an instance
248 of StringTypes not StringType. Accounts for Unicode strings.
249
250 * Thuban/Model/color.py: Implemented __repr__ to make
251 debugging a bit easier.
252
253 * Thuban/Model/save.py (Saver.write_classification): Need to
254 save the group label.
255
256 * test/test_load.py (testClassification): New. Loads the
257 iceland_sample_test.thuban file and checks if it was loaded
258 correctly.
259
260 2003-04-15 Jonathan Coles <[email protected]>
261
262 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
263 to improve rendering performance by initializing the variables
264 that are not change each time draw_polygon_shape() is called.
265 The values are stored in a global struct draw_info.
266 (draw_polygon_shape): Removed initialization code that is
267 now in draw_polygon_init().
268
269 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
270 drawing initialization call to draw_polygon_init()
271 (MapRenderer.draw_polygon_shape): Use new signature of
272 draw_polygon_shape.
273
274 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
275 weirdness by setting the range to (1, maxint).
276
277 * Thuban/Model/classification.py (ClassGroupProperties): Make
278 instance variables private and optimize comparison operator
279 by first checking if the color references are the same.
280 (ClassGroupSingleton): Make instance variables private.
281 (ClassGroupRange): Make instance variables private.
282
283 * HOWTO-Release: Filled in missing steps for releasing packages.
284
285 2003-04-15 Bernhard Herzog <[email protected]>
286
287 First stab at internationalized messages:
288
289 * Thuban/__init__.py (_): Implement the translation function for
290 real using the python gettext module.
291
292 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
293 translate empty strings.
294
295 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
296 Add a missing space to a warning message
297
298 * po/README: New. Notes about the management of the translation
299 files.
300
301 * po/Makefile: New. Makefile to help manage the translation files.
302
303 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
304
305 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
306 translations and support files in po/
307
308 * setup.py (data_files): Add the *.mo files to the data_files too
309
310 * README: Add note about the translations when building from CVS
311
312 2003-04-14 Jonathan Coles <[email protected]>
313
314 * Thuban/UI/dock.py: Fixes some window resizing problems most
315 noticable under windows. Always assume the button bitmaps will
316 be there. Code clean up.
317 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
318 images for the dock/undock button to the same images.
319 Work around for RTbug #1801.
320
321 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
322 be allowed to grow within the sizer. Fixes a bug under Windows
323 where the toolbar wasn't being drawn.
324
325 2003-04-14 Frank Koormann <[email protected]>
326
327 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
328 Updated design to try to make the button functionality more
329 transparent.
330
331 2003-04-14 Jonathan Coles <[email protected]>
332
333 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
334 finalize the intialization of the panel.
335
336 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
337 creation of the panel. Should be the last thing called in the
338 initializer of a subclass.
339
340 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
341 set the current selections in the combo boxes. This is needed
342 under Windows.
343
344 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
345 level panel to the dialog so that the background colors are
346 consistent under Windows.
347
348 2003-04-11 Jonathan Coles <[email protected]>
349
350 * Thuban/UI/classgen.py: Change color ramps to start at white
351 not black.
352
353 * Thuban/UI/legend.py: Enable/disable the legend buttons when
354 the legend changes. Fixes RTbug #1793.
355
356 * test/test_classification.py: Added test for copying of
357 classifications.
358
359 2003-04-11 Jonathan Coles <[email protected]>
360
361 * Thuban/UI/resource.py: New. Centralize the loading of resources
362 such as bitmaps.
363
364 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
365 added images to the move buttons, added 'reverse' button.
366 (CustomRampPanel.__init__): Added images to the move buttons.
367 (GreyRamp): New. Generates a ramp from white to black.
368 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
369
370 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
371 ID_PROPERTY_*.
372 (Classifier.__init__): Minor changes to the layout.
373 (Classifier._OnTitleChanged): Listen for when the user edits the
374 title and update the dialog's title and the layer's title.
375
376 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
377
378 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
379 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
380 if the layer's title changes.
381
382 * Thuban/UI/mainwindow.py: Added new menu item and associated code
383 to open a dialog to rename the map.
384 (MainWindow): Use new resource class to import bitmaps.
385
386 2003-04-11 Jonathan Coles <[email protected]>
387
388 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
389 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
390 Resources/Bitmaps/group_use_none.xpm,
391 Resources/Bitmaps/group_use_not.xpm,
392 Resources/Bitmaps/hide_layer.xpm,
393 Resources/Bitmaps/layer_properties.xpm,
394 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
395 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
396 New.
397
398 2003-04-10 Jonathan Coles <[email protected]>
399
400 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
401 Should pass group to ClassGroup constructor.
402
403 2003-04-10 Jonathan Coles <[email protected]>
404
405 * Thuban/Model/classification.py: (ClassGroup): Move all the common
406 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
407 here. Implement SetVisible(), IsVisible().
408 (ClassGroup.__init__): Add group parameter which acts as a copy
409 constructor.
410
411 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
412 "Visible" check boxes.
413 (Classifier): Rename the buttons and refactor the code to match
414 the new labels.
415
416 * Thuban/UI/legend.py: Classify button is now called "Properties".
417 Refactored the code to change variable names.
418 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
419
420 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
421 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
422 renamed to MainWindow.LayerEditProperties.
423 (MainWindow.ToggleLegend): Don't include map name in legend title.
424 (MainWindow.SetMap): Added the map name to the window title.
425 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
426 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
427 Functionality is found in the layer properties dialog.
428
429 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
430 draw visible groups.
431
432 2003-04-09 Jonathan Coles <[email protected]>
433
434 * Thuban/UI/classgen.py: Modifications to allow simple
435 addition and selection of new color schemes.
436 (MonochromaticRamp): New. Generates a ramp between two colors.
437 (RedRamp): New. Generates a ramp of all red.
438 (GreenRamp): New. Generates a ramp of all green.
439 (BlueRamp): New. Generates a ramp of all blue.
440
441 2003-04-09 Jonathan Coles <[email protected]>
442
443 * Thuban/Model/classification.py (Classification.__deepcopy__):
444 Need to copy over field and fieldType attributes.
445
446 * Thuban/Model/table.py (Table.field_range): New. Retrive the
447 maximum and minimum values over the entire table for a given
448 field.
449 (Table.GetUniqueValues): New. Retrieve all the unique values
450 in the table for a given field.
451
452 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
453 (GenUniquePanel): New. Controls to allow the user to select
454 which unique field values they would like in the classification.
455 (CustomRampPanel): Code that was in ClassGenDialog that allows
456 the user to select the properties for a custom ramp.
457 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
458
459 * Thuban/UI/classifier.py: Removed a lot of debugging code.
460 (Classifier._SetClassification): Callback method so that the
461 class generator can set the classification in the grid.
462 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
463 editing of a group properties class into a wxWindows control.
464
465 * Thuban/UI/dock.py: It was decided that if the user closes
466 a dockable window the window should simply hide itself. That
467 way if the user wants to show the dock again it appears in the
468 same place as it was when it was closed.
469 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
470 (DockableWindow._OnButtonClose): Hide the window instead of
471 destroying it.
472 (DockableWindow._OnClose): Hide the window instead of
473 destroying it.
474
475 * Thuban/UI/legend.py (LegendTree): Use a private method to
476 consistently set the font and style of the text. Fixes RTbug #1786.
477
478 * Thuban/UI/mainwindow.py: Import just the Classifier class.
479
480 2003-04-07 Bernhard Herzog <[email protected]>
481
482 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
483 to the map module
484
485 2003-04-07 Bernhard Herzog <[email protected]>
486
487 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
488 favor of ToggleSessionTree
489 (MainWindow.ToggleSessionTree): New method to toggle visibility of
490 the session tree.
491 (MainWindow.SessionTreeShown): New method to return whether the
492 session tree is currently shown.
493 (MainWindow.ToggleLegend): New method to toggle visibility of the
494 legend
495 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
496 LegendShown
497 (MainWindow.LegendShown): New method to return whether the legend
498 is currently shown.
499 (_method_command): Add checked parameter so we can define check
500 menu items
501 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
502 mainwindow methods.
503 (show_session_tree, show_legend commands): Removed.
504 (toggle_session_tree, toggle_legend commands): New commands to
505 toggle the visibility of the dialogs
506
507 2003-04-07 Jonathan Coles <[email protected]>
508
509 * Thuban/UI/classgen.py: Fix Windows problem.
510
511 * Thuban/UI/dock.py: Fix Windows problem.
512
513 * Thuban/UI/mainwindow.py: Use False instead of false.
514 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
515
516 2003-04-07 Jonathan Coles <[email protected]>
517
518 Since we now say that the order of the groups in a classification
519 matters, it makes sense to be able to manipulate that order. Most
520 of the changes to Thuban/Model/classification.py are to that end.
521
522 * Thuban/Model/classification.py (Classification.AppendGroup,
523 Classification.InsertGroup, Classification.ReplaceGroup,
524 Classification.RemoveGroup, Classification.GetGroup): Do as the
525 names imply.
526 (Classification.FindGroup): This was called GetGroup, but GetGroup
527 takes an index, while FindGroup takes a value.
528 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
529 REFERENCE. Currently there is a cyclic reference between the layer
530 and its classification. If the classification doesn't need to know
531 its owning layer we can change this, since it may make sense to be
532 able to use the same classification with different layers.
533
534 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
535
536 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
537 not AddGroup()
538
539 * Thuban/UI/classifier.py: Now that we can depend on the order in
540 a Classification and have methods to manipulate that order we don't
541 need to use our own data structures in the grid. We can simply make
542 the grid/table access the information they need from a copy of
543 the classification object.
544 (Classifier._OnCloseBtn): Event handler for when the user clicks
545 'Close'. This is needed so if the user applies changes and then
546 continues to change the table the user has the option of discarding
547 the most recent changes and keeping what they applied.
548
549 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
550 into the same group.
551
552 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
553 with a really old version of proj, PJ_VERSION won't even be defined.
554 If it isn't defined then just compile so that the function always
555 returns Py_False.
556
557 * test/test_classification.py: Fix tests to use the renamed methods.
558 Still need to write tests for the new methods.
559
560 2003-04-04 Jonathan Coles <[email protected]>
561
562 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
563 call to SetSelection out of the method and before the call
564 to __SelectField in __init__. This prevents a recursion of events
565 when _OnFieldSelect is triggered by the user.
566
567 2003-04-04 Jonathan Coles <[email protected]>
568
569 * Thuban/Model/classification.py: Rename Color.None to
570 Color.Transparent.
571 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
572 Don't bother copying the color, since Colors are immutable.
573
574 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
575 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
576 Thuban/UI/renderer.py, Thuban/UI/view.py:
577 Rename Color.None to Color.Transparent.
578
579 * test/test_classification.py, test/test_load.py: Rename Color.None
580 to Color.Transparent.
581
582 2003-04-04 Jonathan Coles <[email protected]>
583
584 * Thuban/Model/classification.py: Fix assert calls.
585 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
586 Copy the color parameter rather than hold onto a reference.
587
588 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
589 the color object.
590 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
591 are sure there exists only one refernce to Color.None in the system.
592 This allows us to use 'is' rather than the comparision functions.
593
594 * Thuban/Model/save.py: Fix assert calls.
595
596 * Thuban/UI/classifier.py: Fix assert calls.
597 (ClassGrid._OnCellDClick): Call up to the classifier to open the
598 dialog to edit the groups properties.
599 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
600 correctly if a cell is resized.
601 (ClassTable.SetClassification): New. Changes the classification
602 that is in the table.
603 (ClassTable.__SetRow): Allow groups to be prepended.
604 (Classifier): New code for opening the EditProperties and
605 GenerateRanges dialogs.
606 (SelectPropertiesDialog.__GetColor): Only set the color in the
607 color dialog if the current color is not None.
608
609 * Thuban/UI/dock.py: Fix assert calls.
610
611 * Thuban/UI/legend.py: Fix assert calls.
612
613 * Thuban/UI/renderer.py: Fix assert calls.
614
615 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
616 classifications.
617 (GenRangePanel): Panel specific to range generation.
618 (GenSingletonPanel): Panel specific to singleton generation.
619 (ClassGenerator): Class responsible for actually generating
620 the classification from the data gathered in the dialog box.
621 (PropertyRamp): Generates properties whose values range from
622 a starting property to an ending property.
623
624 2003-04-03 Bernhard Herzog <[email protected]>
625
626 * test/support.py (print_garbage_information): New function that
627 prints information about still connected messages and memory
628 leaks.
629 (run_suite): Removed.
630 (run_tests): New function for use as a replacement of
631 unittest.main in the test_* files. This one calls
632 print_garbage_information at the end.
633
634 * test/runtests.py (main): Use support.print_garbage_information
635
636 * test/test_layer.py: Use support.run_tests instead of
637 unittest.main so we get memory leak information
638 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
639 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
640 (TestLayerLegend.test_visibility): Call the layer's Destroy method
641 to fix a memory leak.
642
643 * test/test_classification.py: Use support.run_tests instead of
644 unittest.main so we get memory leak information
645 (TestClassification.test_classification): Call the layer's Destroy
646 method to fix a memory leak.
647
648 2003-04-02 Bernhard Herzog <[email protected]>
649
650 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
651 Handle the reference counts of the return value and errors in
652 PyArg_ParseTuple correctly.
653
654 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
655 sure the filename is absolute to avoid problems when saving the
656 session again
657
658 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
659
660 2003-04-01 Jonathan Coles <[email protected]>
661
662 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
663 that there actually are points in the returned list of points
664 before trying to index into the list. The list may be empty if
665 the shape is a Null Shape.
666
667 2003-04-01 Bernhard Herzog <[email protected]>
668
669 * test/test_map.py: Don't use from <module> import *
670
671 2003-04-01 Jonathan Coles <[email protected]>
672
673 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
674 LAYER_LEGEND_CHANGED
675
676 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
677 self.Destroy() to close the window after yesterday's changes.
678
679 * test/test_map.py, test/test_session.py: Fix messages that
680 are sent from maps and layers.
681
682 2003-03-31 Jonathan Coles <[email protected]>
683
684 * Thuban/UI/classifier.py: Commented out some debugging statements.
685 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
686 RTbug #1769.
687
688 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
689 position (although position doesn't work yet under GTK).
690 (DockableWindow.Destroy): New. Called when the window must be
691 closed. Namely needed when the DockFrame closes and must close
692 its children.
693 (DockFrame): Listen for EVT_CLOSE and destroy all children.
694
695 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
696 when then window is told to close.
697 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
698 comment in source for more info.
699
700 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
701
702 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
703 symmetry with other such methods.
704 (MainWindow.ShowLegend): Show the legend docked by default.
705
706 2003-03-28 Jonathan Coles <[email protected]>
707
708 * Thuban/UI/classifier.py: Support for highlighting a specific
709 group within the grid when the classification dialog is opened.
710 Also contains a lot of debugging printouts which will later
711 be removed.
712
713 * Thuban/UI/dock.py: Complete rework on the dock code so that
714 that it is fairly removed from the rest of the Thuban application.
715 It is easy to add new docks which the rest of the program having
716 to be aware of them.
717
718 * Thuban/UI/legend.py: Modifications to support selecting a
719 specific group in the classification dialog. Changed how layers
720 are drawn when the layer is visible/invisible.
721
722 * Thuban/UI/mainwindow.py: Removed legend specific code and
723 replaced it with calls to the new dock code.
724
725 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
726 to check if scale > 0. Trying to track down a divide by zero.
727
728 2003-03-26 Jonathan Coles <[email protected]>
729
730 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
731 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
732 now part of DockableWindow.
733 (LegendPanel.DoOnSelChanged): Select the current layer in the
734 map.
735 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
736 with the selected layer and/or group.
737
738 2003-03-26 Jonathan Coles <[email protected]>
739
740 This putback contains the code for dockable windows. There is
741 no support in wxWindows as of this date for windows that can
742 attach themselves to other windows.
743
744 The current model contains a DockableWindow which has a parent
745 window for when it is detached and a dock window that it puts
746 its contents in when it is docked. The contents of a DockableWindow
747 must be a DockPanel. DockPanel itself derives from wxPanel.
748
749 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
750 message, not a LAYER_LEGEND_CHANGED message.
751
752 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
753
754 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
755 as one of the style properties for the fieldTypeText item to
756 be sure that its size is correct when the text changes.
757
758 * Thuban/UI/dock.py: New. Classes for the DockPanel and
759 DockableWindow.
760
761 * Thuban/UI/legend.py: Added some more buttons and made the
762 LegendPanel a DockPanel.
763
764 * Thuban/UI/mainwindow.py: Added sash windows to the main window
765 and supporting functions for manipulating the sashes.
766 (MainWindow.ShowLegend): Create a DockableWindow with the
767 LegendPanel as the contents.
768
769 * Thuban/UI/messages.py: Added DOCKABLE_* messages
770
771 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
772 not LAYER_LEGEND_CHANGED, messages.
773
774 2003-03-25 Jonathan Coles <[email protected]>
775
776 * setup.py: Added custom script bdist_rpm_build_script so that
777 when the rpm is built the path to wx-config is correct.
778
779 * setup.cfg: Added line saying to use the custom build script
780
781 2003-03-20 Jonathan Coles <[email protected]>
782
783 Initial implementation of the Legend.
784
785 * Thuban/UI/legend.py: New. Creates a window that shows the map's
786 Legend information and allows the user to add/modify classifications
787 and how the layers are drawn on the map.
788
789 * setup.py: New command 'build_docs' which currently uses
790 happydoc to generate html documentation for Thuban.
791
792 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
793 Returns a string which is appropriately describes the group.
794
795 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
796 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
797
798 * Thuban/Model/map.py (Map): Rename messages and use new, more
799 specific, messages.
800
801 * Thuban/Model/messages.py: New message to indicate that a layer's
802 data has changed (LAYER_CHANGED). New map messages to indicate
803 when layers have been added/removed/changed or if the stacking order
804 of the layers has changed.
805
806 * Thuban/Model/session.py: Rename and use new messages.
807
808 * Thuban/UI/classifier.py: Remember if any changes have actually
809 been applied so that if the dialog is cancelled without an application
810 of changes we don't have to set a new classification.
811 (ClassDataPreviewer): Pulled out the window specific code and put it
812 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
813 symbols on any DC.
814
815 * Thuban/UI/mainwindow.py: New code to open the legend.
816
817 * Thuban/UI/view.py: Use new message names.
818
819 2003-03-19 Jonathan Coles <[email protected]>
820
821 * Thuban/UI/main.py (verify_versions): New. Checks the versions
822 of Python, wxPython, and some other libraries.
823
824 * extensions/thuban/wxproj.cpp (check_version): Checks the given
825 version against what wxproj was compiled with.
826 (check_version_gtk): If wxproj was compiled with gtk then check
827 the given version against the version of the gtk library
828 currently being used.
829
830 2003-03-14 Bernhard Herzog <[email protected]>
831
832 * test/test_command.py: Run the tests when the module is run as a
833 script
834
835 2003-03-14 Bernhard Herzog <[email protected]>
836
837 Implement selection of multiple selected shapes in the same layer:
838
839 - Introduce a new class to hold the selection. This basically
840 replaces the interactor which was nothing more than the
841 selection anyway. A major difference is of course that the new
842 selection class supports multiple selected shapes in one layer
843
844 - Move the object that represents the selection from the
845 application to the canvas. The canvas is a better place than the
846 application because the selection represents which shapes and
847 layer of the map displayed by the canvas are selected and
848 affects how the map is drawn.
849
850 - Make the selection and its messages publicly available through
851 the mainwindow.
852
853 - The non-modal dialogs do not get a reference to the interactor
854 anymore as they can simply refer to their parent, the
855 mainwindow, for the what the interactor had to offer.
856
857 * Thuban/UI/selection.py: New module with a class to represent the
858 selection.
859
860 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
861 these unused messages
862
863 * Thuban/UI/application.py (ThubanApplication.OnInit)
864 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
865 interactor is gone now.
866 (ThubanApplication.CreateMainWindow): There is no interactor
867 anymore so we pass None as the interactor argument for now for
868 compatibility.
869
870 * Thuban/UI/view.py (MapCanvas.delegated_messages)
871 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
872 Unsubscribe, delegate messages according to the delegated_messages
873 class variable.
874 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
875 attributes from instance variables as described with the
876 delegated_methods class variable.
877 (MapCanvas.__init__): New instance variable selection holding the
878 current selection
879 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
880 pass them on to the renderer
881 (MapCanvas.SetMap): Clear the selection when a different map is
882 selected.
883 (MapCanvas.shape_selected): Simple force a complete redraw. The
884 selection class now takes care of only issueing SHAPES_SELECTED
885 messages when the set of selected shapes actually does change.
886 (MapCanvas.SelectShapeAt): The selection is now managed in
887 self.selection
888
889 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
890 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
891 Unsubscribe, delegate messages according to the delegated_messages
892 class variable.
893 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
894 attributes from instance variables as described with the
895 delegated_methods class variable.
896 (MainWindow.__init__): The interactor as ivar is gone. The
897 parameter is still there for compatibility. The selection messages
898 now come from the canvas.
899 (MainWindow.current_layer, MainWindow.has_selected_layer):
900 Delegate to the the canvas.
901 (MainWindow.LayerShowTable, MainWindow.Classify)
902 (MainWindow.identify_view_on_demand): The dialogs don't need the
903 interactor parameter anymore.
904
905 * Thuban/UI/tableview.py (TableFrame.__init__)
906 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
907 (LayerTableFrame.row_selected): The interactor is gone. It's job
908 from the dialog's point of view is now done by the mainwindow,
909 i.e. the parent. Subscribe to SHAPES_SELECTED instead
910 of SELECTED_SHAPE
911
912 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
913 is gone. It's job from the dialog's point of view is now done by
914 the mainwindow, i.e. the parent.
915
916 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
917 gone. It's job from the dialog's point of view is now done by the
918 mainwindow, i.e. the parent.
919
920 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
921 gone. It's job from the dialog's point of view is now done by the
922 mainwindow, i.e. the parent.
923 (SessionTreeCtrl.__init__): New parameter mainwindow which is
924 stored as self.mainwindow. The mainwindow is need so that the tree
925 can still subscribe to the selection messages.
926 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
927 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
928 selection is now accessible through the mainwindow. Subscribe to
929 SHAPES_SELECTED instead of SELECTED_SHAPE
930
931 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
932 SHAPES_SELECTED message now.
933 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
934 so deal with multiple shapes
935 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
936 gone. It's job from the dialog's point of view is now done by the
937 mainwindow, i.e. the parent.
938
939 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
940 parameter is now a list of shape ids.
941 (RecordTable.SetTable): The second parameter is now a list of
942 indices.
943
944 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
945 selected_shape parameter and ivar to selected_shapes. It's now a
946 list of shape ids.
947 (MapRenderer.draw_label_layer): Deal with multiple selected
948 shapes. Rearrange the code a bit so that the setup and shape type
949 distinctions are only executed once.
950
951 * test/test_selection.py: Test cases for the selection class
952
953 2003-03-11 Jonathan Coles <[email protected]>
954
955 * Thuban/Model/load.py: Temporary fix so that the xml reader
956 doesn't cause Thuban to crash.
957
958 * Thuban/Model/layer.py: Handle the cyclic references between
959 a layer and its classification better, and be sure to disconnect
960 the classification from the layer when the layer is destroyed
961 so that we don't maintain a cyclic reference that may not be
962 garbage collected.
963
964 * Thuban/Model/classification.py: See comment for layer.py.
965
966 2003-03-12 Jan-Oliver Wagner <[email protected]>
967
968 * HOWTO-Release: New. Information on the steps for releasing
969 a new version of Thuban.
970
971 2003-03-11 Jonathan Coles <[email protected]>
972
973 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
974 Use True instead of true.
975 (Classifier): Should have a single panel in which all the controls lie.
976
977 * Thuban/UI/proj4dialog.py: Add normal border.
978
979 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
980
981 * Thuban/UI/mainwindow.py: Use True instead of true.
982
983 * setup.py: Update some definitions to use wxWindows2.4 files
984
985 * Data/iceland_sample_class.thuban: Fixed file so that the
986 field_type information is present.
987
988 2003-03-10 Jonathan Coles <[email protected]>
989
990 * Thuban/UI/classifier.py (Classifier.__init__): Make the
991 field type label grow so that when the text changes the
992 size is updated correctly. This may be a wxWindows bug.
993
994 2003-03-10 Jonathan Coles <[email protected]>
995
996 * Thuban/UI/application.py: Changed SESSION_CHANGED to
997 SESSION_REPLACED.
998
999 * Thuban/UI/classifier.py: Wrap text with _().
1000 (ClassGrid.CreateTable): Set dimensions and size hints here,
1001 instead of in Reset, so we only set the size once.
1002
1003 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
1004
1005 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1006 Call Close() instead of Shutdown().
1007
1008 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1009
1010 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1011 Go back to using OnClose() instead of Shutdown().
1012
1013 2003-03-10 Jonathan Coles <[email protected]>
1014
1015 * Thuban/UI/classifier.py (Classifier): SelectField() needed
1016 to know the old field index as well as the new one.
1017
1018 2003-03-10 Jonathan Coles <[email protected]>
1019
1020 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
1021 to correctly set the table information and call this from
1022 __init__ and from _OnFieldSelect so that all the information
1023 is up to date when the dialog opens and when a field is changed.
1024
1025 2003-03-10 Jonathan Coles <[email protected]>
1026
1027 * Thuban/Model/classification.py (Classification): Don't use
1028 layer's message function directly, use the ClassChanged() method
1029 when then classification changes. SetField/SetFieldType/SetLayer
1030 must keep the information about field name and field type in
1031 sync when an owning layer is set or removed.
1032
1033 * Thuban/Model/layer.py: Added ClassChanged() so that the
1034 classification can tell the layer when its data has changed.
1035 (Layer.SetClassification): Accepts None as an arguement to
1036 remove the current classification and correctly handles
1037 adding a new classification.
1038
1039 * Thuban/Model/load.py: Comment out print statement
1040
1041 * test/test_classification.py, test/test_save.py: New and
1042 improved tests.
1043
1044 2003-03-07 Jonathan Coles <[email protected]>
1045
1046 * Thuban/Model/classification.py: Implemented __copy__ and
1047 __deepcopy__ for ClassGroup* and ClassGroupProperites so
1048 they can easily be copied by the classifier dialog.
1049 (ClassGroupProperites.__init__): The default line color should
1050 have been Color.Black.
1051
1052 * Thuban/UI/classifier.py: Setting and Getting table values now
1053 uses a consistent set of functions.
1054 (Classifier): Now non-modal. Has field type label which changes
1055 as the field changes. Keep track of buttons in a list so that
1056 we can enable/disable the buttons when the None field is selected.
1057 (SelectPropertiesDialog): Add buttons to make the colors transparent.
1058
1059 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
1060 does what OnClose did, but can be called by the application to
1061 close a window. Needed when a session changes, and we have to
1062 close the classifier windows.
1063
1064 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1065 Shuts down open dialogs. Used when a new session is created
1066 or a session is opened.
1067 (MainWindow.SaveSession): Should only call application.SaveSession()
1068 if we don't call SaveSessionAs first.
1069 (MainWindow.Classify): Allow different classifier dialogs for
1070 different layers.
1071
1072 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
1073 the parent class handle it. Add Shutdown() to unsubscibe from
1074 event notification and call the parent Shutdown(). This was
1075 necessary so the application can close the tree window.
1076
1077 2003-03-06 Jonathan Coles <[email protected]>
1078
1079 * Thuban/Model/classification.py: Minor documentation changes,
1080 Addition of __eq__ and __ne__ methods.
1081 (Classification.SetLayer): prevent recursion between this method
1082 and Layer.SetClassification().
1083
1084 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
1085
1086 * Thuban/Model/layer.py (SetClassification): prevent recursion
1087 between this method and Classification.SetLayer().
1088
1089 * test/test_classification.py, test/test_load.py,
1090 test/test_session.py: Fixed and added tests for the classification
1091 classes.
1092
1093 2003-03-06 Bernhard Herzog <[email protected]>
1094
1095 * Thuban/UI/classifier.py (ClassGrid.__init__)
1096 (ClassGrid.CreateTable): Move the SetSelectionMode call to
1097 CreateTable because otherwise it triggers an assertion in
1098 wxPython/wxGTK 2.4.
1099
1100 2003-03-05 Jonathan Coles <[email protected]>
1101
1102 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
1103
1104 * Thuban/Model/load.py: import FIELDTYPE constants from table.
1105
1106 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
1107
1108 * Thuban/Model/table.py: Put FIELDTYPE constants back.
1109
1110 2003-03-05 Jonathan Coles <[email protected]>
1111
1112 * Thuban/UI/classifier.py: Added class documentation.
1113 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
1114 Store just the groups in the table and generate the other
1115 column information when it is requested. Add "None" field
1116 to pull-down to select no classification.
1117
1118 * Thuban/common.py: Moved FIELDTYPE constants from table.py
1119 (Str2Num): Only catch ValueError exceptions.
1120
1121 * Thuban/Model/classification.py: Class documentation. Renaming
1122 of methods with Stroke to Line. Groups are stored in a single
1123 list with the default as the first element. Groups are searched
1124 in the order they appear in the list.
1125
1126 * Thuban/Model/color.py: Documentation.
1127
1128 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
1129 the kind of data represented by a field.
1130
1131 * Thuban/Model/load.py (ProcessSession): Use proper string
1132 conversion function; fixes RTbug #1713.
1133
1134 * Thuban/Model/save.py (Saver): Store field type information.
1135
1136 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
1137 (Table): Add field_info_by_name() to retrieve field information
1138 by specifying the field name, not the number.
1139
1140 * Thuban/UI/mainwindow.py: Function name changes.
1141
1142 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1143 get the layer classification once. Don't try to classify
1144 values when the field is None: just use the default properties.
1145
1146 * Thuban/UI/view.py: Function name changes.
1147
1148 * Doc/thuban.dtd: Add field_type attribute to a classification.
1149
1150 2003-03-04 Bernhard Herzog <[email protected]>
1151
1152 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
1153 the fill and stroke layer attributes optional with suitable
1154 default values. Add the stroke_width layer attribute. Use correct
1155 syntax for empty elements. Make the attribute list for labels
1156 refer to the label element.
1157
1158 2003-03-04 Bernhard Herzog <[email protected]>
1159
1160 * setup.py (thuban_build_py.build): Add a comment about distutils in
1161 Python 2.3 containing some of the functionality we implement in
1162 setup.py ourselves.
1163
1164 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
1165 before the selection mode. Doing it the other way round triggers
1166 an assertion in wxWindows.
1167
1168 * Thuban/Model/save.py (escape): Fix typo in doc-string
1169
1170 * Thuban/Model/classification.py: Remove unnecessary wxPython
1171 import
1172
1173 2003-03-04 Jonathan Coles <[email protected]>
1174
1175 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
1176 Parameter 'value' should default to None.
1177
1178 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
1179 the class attribute __classification is now private.
1180
1181 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
1182 Classifier to ClassGrid. Added support for removing selected rows,
1183 which including code for keeping track of when cells are selected,
1184 and deselected.
1185 (ClassTable): Support for added/removing rows. Fixed a problem
1186 with __ParseInput whereby it would not allow strings (only numbers)
1187 to be entered.
1188 (Classifier): Added button and supporting code for removing
1189 selected rows.
1190
1191 2003-02-27 Jonathan Coles <[email protected]>
1192
1193 * Thuban/common.py: Moved color conversion functions into
1194 Thuban/UI/common.py.
1195 (Str2Num): Now converts the float (not the string) to a long/int
1196 so that an exception isn't thrown.
1197
1198 * Thuban/UI/common.py: Common functions used in several UI modules
1199
1200 * Thuban/Model/classification.py: Changed the class hierarchy
1201 so that a Classification consists of Groups which return
1202 Properties when a value matches a Group.
1203
1204 * Thuban/Model/layer.py: Fixed name resolution problem.
1205
1206 * Thuban/Model/load.py: Use new Classification and Group functions.
1207
1208 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
1209 failure.
1210 (Saver.write_classification): Use new Classification and Group
1211 functions.
1212
1213 * Thuban/UI/classifier.py: Changes to use new Classification and Group
1214 functions. Fix to create a tuple with a single value instead of
1215 simply returning the value.
1216
1217 * Thuban/UI/renderer.py: Use new Classification and Group functions.
1218 Use common.py functions.
1219
1220 * Thuban/UI/tree.py: Use common.py functions.
1221
1222 * test/test_classification.py: Use new Classification and Group
1223 classes.
1224
1225 2003-02-24 Jonathan Coles <[email protected]>
1226
1227 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
1228 functions from Thuban color objects to wxWindow colour objects.
1229
1230 * Thuban/Model/classification.py (Classification): Renamed
1231 GetProperties() to GetClassData(). Used the new iterator
1232 in TreeInfo().
1233 (ClassIterator): Iterator implementation to iterate over the
1234 ClassData objects in a classification object.
1235
1236 * Thuban/Model/save.py (Saver.write_classificaton): Uses
1237 the new iterator to save the classification information.
1238
1239 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
1240 for changing the stroke and fill colors and previewing the
1241 changes.
1242
1243 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
1244 MainWindow.SaveSessionAs): Text string changes so the dialogs
1245 have more meaningful titles.
1246
1247 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
1248 Classification method name from GetProperties to GetClassData.
1249
1250 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
1251 instead of accessing now non-existent class variables.
1252
1253 2003-02-24 Bernhard Herzog <[email protected]>
1254
1255 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
1256 unneeded Shape() call. Rendering is substantially faster without
1257 it and it avoids some problems with broken shape files.
1258
1259 2003-02-20 Frank Koormann <[email protected]>
1260
1261 Force minimal size of identify and label dialogs. The autosizing
1262 looked too ugly.
1263
1264 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
1265 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
1266 Set size of listctrl.
1267 * Thuban/UI/identifyview.py (IdentifyView.__init__):
1268 Set size of dialog.
1269
1270 2003-02-19 Jonathan Coles <[email protected]>
1271
1272 * test/test_classification.py, test/test_layer.py,
1273 test/test_load.py, test/test_map.py, test/test_session.py:
1274 Updated the tests to use the new functions that are in the
1275 respective classes.
1276
1277 * Thuban/Model/classification.py (Classification):
1278 Uses the new ClassData* classes. Modification messages are
1279 passed up to the parent layer (if it exists).
1280 (ClassData): New class to encapsulate the common data in each
1281 classification property.
1282 (ClassDataDefault): Represents the Default class. data.
1283 (ClassDataPoint): Represents a single class. data point
1284 (ClassDataRange): Represents a class. range
1285 (ClassDataMap): Represents a class. map (unused).
1286
1287 * Thuban/Model/color.py: Added Color.None to represent something
1288 with no color. Color.Black represents the color black.
1289 (NoColor): Helper class derived from Color to represent something
1290 with no color.
1291
1292 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
1293 stroke_width attributes. Made the 'classification' attribute private.
1294 New methods for setting/getting the classification.
1295
1296 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
1297 to get the classifcation and use the new ClassData* classes to
1298 hold the classification data. Use Str2Num to convert numbers
1299 properly.
1300
1301 * Thuban/Model/save.py (Saver): Use new Color and Classification
1302 methods
1303
1304 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
1305 custom grid.
1306 (ClassTable): Support for editing Values and Labels and for
1307 changing what type (point or range) of data is stored in each
1308 property based on how the user enters the data.
1309 (Classifier): Support for saving the new classifications and
1310 launching the dialog to edit a property.
1311 (SelectPropertiesDialog): New class for editing the visual
1312 properties of a classification (stroke color, width, and fill color)
1313 (ClassPreviewer): Took the Draw method from ClassRenderer and
1314 made most of it into this new class. Intend to use this class in
1315 the SelectPropertiesDialog for previewing changes.
1316
1317 * Thuban/UI/renderer.py: Use new Color and Classification methods.
1318
1319 * Thuban/UI/tree.py: Formatting changes.
1320
1321 * Doc/thuban.dtd: Add 'label' element
1322
1323 * Thuban/common.py: New. Contains common routines used throughout
1324 the code.
1325 (Str2Num): Takes a string and converts it to the "best" type of
1326 number.
1327
1328 2003-02-14 Bernhard Herzog <[email protected]>
1329
1330 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
1331 dragging flag is always set to 0 even when the tool implementation
1332 raises an exception
1333
1334 2003-02-11 Bernhard Herzog <[email protected]>
1335
1336 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
1337 method to create a splash screen.
1338 (ThubanApplication.ShowMainWindow): New. Show the main window.
1339 Needed so the splash screen can display the mainwindow
1340 (ThubanApplication.OnInit): Call the
1341 new splash_screen method to determine whether the application
1342 should display a splash screen. If it displays a splash screen do
1343 not immediately show the main window.
1344
1345 2003-02-11 Jonathan Coles <[email protected]>
1346
1347 * Thuban/Model/classification.py: Added import line to fix
1348 feature conflicts between running on python2.2 and python2.1.
1349
1350 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
1351 onto the clinfo parameter, so removed the deepcopy().
1352
1353 2003-02-10 Jonathan Coles <[email protected]>
1354
1355 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
1356 Added element_open variable to track opening and closing of tags
1357 so that tags that don't span more than one line are closed with
1358 /> instead of </tag_name>. Use the GetDefault*() methods of
1359 the Classification class.
1360
1361 * Thuban/Model/classification.py (Classificaton): Added set and
1362 get methods for the default data. The class also takes a layer
1363 reference so that modification messages can be sent. Fixed the
1364 methods to use the new ClassData class.
1365 (ClassData): New class to encapsulate the classification data
1366
1367 * Thuban/Model/layer.py (Layer): Remove the
1368 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
1369 SetDefault*() methods on the layer's classification object.
1370 (Layer.__init__): Use the new SetDefault*() methods in the
1371 Classification class.
1372
1373 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
1374 object instead of a dictionary.
1375
1376 * Thuban/UI/classifier.py (ClassRenderer): New class to
1377 draw the classifications in the dialog box's table.
1378 (Classifier): Modified to use the ClassRenderer class.
1379
1380 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
1381 methods of the Classification class.
1382
1383 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
1384 of the ClassData class.
1385
1386 * test/test_classification.py, test/test_layer.py,
1387 test/test_map.py, test/test_session.py: Fix the tests to work
1388 with the above code changes.
1389
1390 2003-02-03 Jonathan Coles <[email protected]>
1391
1392 * Thuban/Model/classification.py (Classification): Added getNull()
1393 to return the NullData reference
1394
1395 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
1396 Layer.SetStrokeWidth): Modified these functions to change the
1397 null data in the classification rather than keep these values
1398 directly in the Layer class. Menu options to change these values
1399 work again.
1400
1401 2003-01-28 Jonathan Coles <[email protected]>
1402
1403 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
1404 Fixed crashing problem on some systems. Dialog box shows
1405 classification data.
1406
1407 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
1408 Colors in the tree view.
1409
1410 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
1411 the tree info for classifications. Commented out unnecessary lines.
1412
1413 * Thuban/Model/classification.py (Classification.TreeInfo): New
1414 function to add information about the classification into the
1415 tree view.
1416
1417 2003-01-27 Jan-Oliver Wagner <[email protected]>
1418
1419 * Thuban/__init__.py (_): New.
1420
1421 * Thuban/Model/classification.py, Thuban/Model/extension.py,
1422 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
1423 Thuban/Model/session.py, Thuban/UI/application.py,
1424 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
1425 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
1426 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
1427 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
1428 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
1429
1430 2003-01-27 Jonathan Coles <[email protected]>
1431
1432 * Thuban/Model/layer.py: Classification initialization calls.
1433
1434 * Thuban/Model/classification.py: Created class to encapsulate
1435 a layer classification. Supports specific data points and
1436 ranges.
1437
1438 * Thuban/Model/load.py: Added support for loading classification
1439 information.
1440
1441 * Thuban/Model/save.py: Added support for saving classification
1442 information.
1443
1444 * Thuban/UI/classifier.py: Initial class for a dialog box for
1445 specifying classification information.
1446
1447 * Thuban/UI/mainwindows.py: Support for opening the classifier
1448 dialog.
1449
1450 * Thuban/UI/renderer.py: Support for drawing a layer with the
1451 classification information.
1452
1453 * Data/iceland_sample_class.thuban: iceland_sample with
1454 classification data.
1455
1456 * test/test_classification: Tests for the Classification class.
1457
1458 2002-12-09 Bernhard Herzog <[email protected]>
1459
1460 * test/test_command.py: New. Tests for the command classes.
1461
1462 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
1463 (Command.IsTool): New method to distinguish between command
1464 switching tools and other commands.
1465
1466 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
1467 the tool to avoid direct assignments to instance variables
1468 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
1469 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
1470 change the tool
1471
1472 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
1473 active tool's command turns insensitive, disable the tool.
1474 (_tool_command): Use the new ToolCommand class
1475
1476 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
1477 SelectTool method to change the tool
1478 (iconfile): Use the ToolCommand class
1479
1480 2002-12-03 Bernhard Herzog <[email protected]>
1481
1482 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
1483 the case of selected items that are not children of Layers or Maps
1484 properly. Previously this bug would trigger an assertion in
1485 wxWindows.
1486
1487 2002-11-06 Frank Koormann <[email protected]>
1488
1489 * Thuban/UI/mainwindow.py: Altered the order of tools in the
1490 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
1491 Full Extent).
1492
1493 2002-10-23 Bernhard Herzog <[email protected]>
1494
1495 * setup.py (setup call): version now 0.1.3
1496
1497 * MANIFEST.in: Add the files in test/
1498
1499 * test/README: Add note about tests requiring the iceland data
1500
1501 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
1502 copyright notice.
1503
1504 2002-10-18 Bernhard Herzog <[email protected]>
1505
1506 * test/test_map.py
1507 (TestMapWithContents.test_projected_bounding_box): Use an explicit
1508 epsilon.
1509
1510 * test/support.py (FloatComparisonMixin.assertFloatEqual)
1511 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
1512 message if the assertion fails and don't return the return value
1513 of self.assert_. In assertFloatSeqEqual the return meant that not
1514 all items of the sequence were compared.
1515
1516 2002-09-20 Bernhard Herzog <[email protected]>
1517
1518 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
1519
1520 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
1521
1522 * test/test_map.py (TestMapWithContents.test_tree_info): Create
1523 the string with the bounding box on the fly because of platform
1524 differences in the way %g is handled.
1525
1526 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
1527 DBFfile too because Thuban layers can't yet cope missing DBF
1528 files.
1529
1530 2002-09-20 Bernhard Herzog <[email protected]>
1531
1532 * test/test_menu.py: Use initthuban instead of
1533 add_thuban_dir_to_path to initialize Thuban.
1534
1535 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
1536 Mixin class for float comparisons
1537 (SubscriberMixin): New. Mixin class to test messages sent through
1538 the Connector class
1539
1540 * test/README: Fix a typo and add the -v flag to the command for
1541 individual tests
1542
1543 * test/test_session.py: New. Test cases for Thuban.Model.session
1544
1545 * test/test_proj.py: New. Test cases for Thuban.Model.proj
1546
1547 * test/test_map.py: New. Test cases for Thuban.Model.map
1548
1549 * test/test_layer.py: New. Test cases for Thuban.Model.layer
1550
1551 * test/test_label.py: New. Test cases for Thuban.Model.label
1552
1553 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
1554
1555 * test/test_color.py: New. Test cases for Thuban.Model.color
1556
1557 * test/test_base.py: New. Test cases for Thuban.Model.base
1558
1559 2002-09-13 Bernhard Herzog <[email protected]>
1560
1561 * Thuban/Model/session.py (Session.forwarded_channels): Forward
1562 the CHANGED channel too.
1563
1564 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
1565 CHANGED channel too.
1566 (Map.__init__): Call the Modifiable constructor as well.
1567
1568 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
1569 event if the modified flag changes.
1570 (Modifiable.changed): Tweak the doc-string.
1571
1572 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
1573 (MainWindow.set_position_text): Put the code that puts the text
1574 with the mouse position into the status bar into the new method
1575 set_position_text so that it can overwritten in derived classes.
1576
1577 2002-09-12 Bernhard Herzog <[email protected]>
1578
1579 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
1580 message box on the main window.
1581
1582 2002-09-11 Bernhard Herzog <[email protected]>
1583
1584 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
1585 the 'E' because it's less likely to interfere with other menu
1586 entries.
1587 (MainWindow.build_menu): remove an incorrect comment.
1588
1589 2002-09-10 Bernhard Herzog <[email protected]>
1590
1591 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
1592 (_tool_command): Add sensitive parameter
1593 (_has_visible_map): Sensitivity callback to tools and other
1594 commands that require a visible map. Use it in map_zoom_in_tool,
1595 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
1596 and map_full_extent
1597
1598 2002-09-06 Bernhard Herzog <[email protected]>
1599
1600 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
1601 VIEW_POSITION
1602
1603 2002-09-04 Frank Koormann <[email protected]>
1604
1605 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
1606
1607 2002-09-02 Bernhard Herzog <[email protected]>
1608
1609 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
1610 wxWindows already and our implementation doesn't work correctly
1611 with wxGTK 2.3:
1612 (MapCanvas.__init__): Remove the instance variable
1613 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
1614 be drawin
1615 (MapCanvas.OnIdle): Removed.
1616
1617 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
1618 a parameter to determine the size of the rectangle.
1619 (MapCanvas.find_shape_at): Create the box around the point on a
1620 layer by layer basis and make the size depend on the shape type.
1621 This solves a problem with the selection of point shapes at the
1622 border of the layer's bounding box
1623
1624 2002-08-30 Bernhard Herzog <[email protected]>
1625
1626 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
1627 for the sensitivity of remove layer.
1628 (_can_remove_layer): New. Sensitivity callback for remove layer
1629 (Command layer_remove): Use _can_remove_layer
1630
1631 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
1632 determine whether a given layer can be deleted.
1633
1634 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
1635 (MapCanvas.do_redraw): Get rid of the unused update_region
1636 instance variable
1637
1638 * Thuban/UI/view.py: Add/update some doc-strings.
1639
1640 * test/: new subdirectory with a bunch of unit tests.
1641
1642 * test/README, test/test_table.py, test/test_save.py,
1643 test/test_menu.py, test/test_load.py: Initial set of tests and
1644 brief instructions on how to run them
1645
1646 2002-08-29 Bernhard Herzog <[email protected]>
1647
1648 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
1649 arcs with multiple parts.
1650
1651 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
1652 Handle degenrate rectangles.
1653
1654 * Thuban/Model/table.py: Make writing records work correctly:
1655 (Table.__init__): Keep track of whether the DBF is open for
1656 writing
1657 (Table.write_record): Open the DBF file for writing when necessary
1658
1659 2002-08-27 Bernhard Herzog <[email protected]>
1660
1661 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
1662 dbf files only for reading by default. Use a new writable dbf
1663 object for writing.
1664
1665 2002-08-26 Bernhard Herzog <[email protected]>
1666
1667 * Thuban/UI/mainwindow.py: Refactor the context creation:
1668 (MainWindow.Context): New method to return a context
1669 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
1670 new method
1671
1672 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
1673 layer table specific code from TableGrid into LayerTableGrid
1674 (TableFrame, LayerTableFrame): Split the layer table specific code
1675 from TableFrame into LayerTableFrame
1676 (LayerTableGrid.select_shape): Remove a debug print
1677
1678 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
1679 LayerTableFrame
1680
1681 2002-08-23 Bernhard Herzog <[email protected]>
1682
1683 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
1684 absolute filename.
1685
1686 2002-08-22 Bernhard Herzog <[email protected]>
1687
1688 * Thuban/Model/table.py (Table.write_record): New method to write
1689 records.
1690 (Table.__init__): Open the DBF file for writing too.
1691
1692 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
1693 into the underlying table.
1694
1695 * extensions/shapelib/shapefil.h (DBFCommit),
1696 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
1697 commit any changes made to the DBF file.
1698
1699 * Thuban/UI/mainwindow.py (make_check_current_tool)
1700 (_tool_command): Put the code that generates the "checked"
1701 callback into a separate function so that we can reuse it
1702 elsewhere
1703
1704 * Thuban/Model/save.py (Saver): New class to handle serializing a
1705 session into an XML file. The main reason to introduce a class is
1706 that applications built on Thuban can derive from it so that they
1707 can save additional information in a session file.
1708 (save_session): Delegate almost all the work to the Saver class.
1709 Rename the filename argument to file because it may be a file like
1710 object now.
1711
1712 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
1713 code. Remove the little test code which would be executed when the
1714 module is run as a script which didn't work anymore since it can't
1715 import the other Thuban modules.
1716 (ProcessSession, load_session): Refactor the ProcessSession to
1717 have one method for each element start and end tag so that derived
1718 classes can easily override the processing of individual tags.
1719 Also, always parse with namespaces enabled because applications
1720 built on top of Thuban will likely use namespaces if they extend
1721 the session file format.
1722
1723 2002-08-21 Bernhard Herzog <[email protected]>
1724
1725 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
1726 because thubaninit_contents will do it for us.
1727
1728 2002-08-16 Jan-Oliver Wagner <[email protected]>
1729
1730 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
1731 tree window already open
1732
1733 2002-08-15 Bernhard Herzog <[email protected]>
1734
1735 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
1736 with self.
1737
1738 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
1739 when we have actually captured it.
1740
1741 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
1742 shapefile and destroy the table.
1743
1744 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
1745
1746 2002-08-14 Bernhard Herzog <[email protected]>
1747
1748 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
1749 instance variable columns
1750 (RecordTable.GetTypeName): row and col may be negative in some
1751 cases.
1752
1753 * setup.py (InstallLocal.initialize_options)
1754 (InstallLocal.finalize_options, InstallLocal.user_options): New
1755 option create-init-file to build a thubaninit.py when running
1756 install_local
1757 (InstallLocal.run): Create the thubaninit.py module when requested
1758 (thubaninit_contents): Split the template into several parts and
1759 create a new function thubaninit_contents that creates the
1760 contents of a thubaninit module.
1761 (ThubanInstall.run): Use the new function to create the thubaninit
1762 module.
1763
1764 2002-07-30 Bernhard Herzog <[email protected]>
1765
1766 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
1767 cleanup.
1768 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
1769
1770 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
1771 direct base class' Destroy method.
1772
1773 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
1774 layers.
1775 (Map.Destroy): Destroy the label_layer as well and call the
1776 inherited Desatroymethod first so that no more messages are
1777 issued.
1778 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
1779 message if the stacking order actually has changed. Add
1780 doc-strings.
1781 (Map.BoundingBox): Correct the doc-string.
1782 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
1783 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
1784
1785 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
1786 all labels.
1787
1788 2002-07-29 Bernhard Herzog <[email protected]>
1789
1790 * Thuban/Model/map.py (Map.subscribe_layer_channels)
1791 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
1792 to a layer's channels into separate methods.
1793 (Map.RemoveLayer, Map.AddLayer): Call the new methods
1794 (Map.Destroy): Unsubscribe from a layer's channels before
1795 destroying it.
1796
1797 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
1798 selected_layer parameter to searched_layer which is the layer to
1799 search in.
1800 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
1801 search to that layer. Return the selected layer and shape.
1802
1803 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
1804 typo
1805
1806 2002-07-24 Bernhard Herzog <[email protected]>
1807
1808 * Thuban/UI/application.py (ThubanApplication.create_session):
1809 Extend the doc string.
1810 (ThubanApplication.subscribe_session)
1811 (ThubanApplication.unsubscribe_session): New methods to
1812 subscribe/unsubscribe to/from session channels.
1813 (ThubanApplication.SetSession): Call the new methods here.
1814 (ThubanApplication.maps_changed, ThubanApplication.set_map):
1815 Renamed set_map to maps_changed. Its now a subscriber for
1816 MAPS_CHANGED.
1817
1818 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
1819 x-coordinate in case of simple clicks
1820
1821 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
1822 don't pass it as a parameter
1823
1824 * Thuban/Model/session.py (Session.RemoveMap): New
1825
1826 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
1827 window size into a parameter.
1828
1829 2002-07-23 Bernhard Herzog <[email protected]>
1830
1831 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
1832 just commands.
1833
1834 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
1835 parameter list a bit to allow setting the window title and the
1836 initial message in the status bar. Update the callers.
1837
1838 * Thuban/UI/application.py (ThubanApplication.OnInit)
1839 (ThubanApplication.CreateMainWindow): Put the mainwindow
1840 instantiation into a separate method so that it can be overridden
1841 by a subclass.
1842
1843 2002-07-19 Bernhard Herzog <[email protected]>
1844
1845 * Thuban/Model/session.py: Issue a CHANGED message every time
1846 another changed message is issued to make it easier to get
1847 notified of changes.
1848 (Session): Update the doc string
1849 (Session.forward): Issue changed-events as CHANGED as well.
1850 (Session.changed): Overwrite the inherited version to issue
1851 CHANGED events as well.
1852
1853 * Thuban/UI/tree.py: We can now simply subscribe to the session's
1854 CHANGED channel to be informed of changes.
1855 (SessionTreeCtrl.session_channels): Not needed any longer.
1856 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
1857 Only have to (un)subscribe CHANGED
1858
1859 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
1860
1861 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
1862 for the wxPython locale bug to __init__.py so that it's
1863 automatically executed by anybody using UI code from Thuban.
1864
1865 2002-07-18 Bernhard Herzog <[email protected]>
1866
1867 * Thuban/UI/main.py (main): app no longer needs to be global
1868
1869 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
1870 as parameter and store it in an instance variable
1871 (MainWindow.invoke_command, MainWindow.update_command_ui)
1872 (MainWindow.save_modified_session, MainWindow.NewSession)
1873 (MainWindow.OpenSession, MainWindow.SaveSession)
1874 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
1875 application object.
1876
1877 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
1878 the main window with self.
1879
1880 * Thuban/UI/context.py: New module with the context class
1881
1882 * Thuban/UI/command.py (Command): Update doc string.
1883
1884 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
1885 MainWindow.update_command_ui): Pass an instance of the context
1886 class to the command's methods
1887 (check_current_tool, call_method): Handle the new context
1888 implementation
1889
1890 * Examples/simple_extensions/simple_tool.py (simple_tool,
1891 check_simple_tool): Handle the new context implementation
1892
1893 * Examples/simple_extensions/simple_command.py (simple_command):
1894 Handle the new context implementation. Update the comments about
1895 the context.
1896
1897 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
1898 doc-string
1899 (ThubanApplication.Session): New method to return the session
1900 object
1901
1902 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
1903 interactor's selected_layer may not be a layer of the current
1904 session when the tree is updated while a new session is being set.
1905
1906 2002-07-17 Bernhard Herzog <[email protected]>
1907
1908 * Thuban/UI/tree.py (color_string): Removed. No longer used.
1909 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
1910 update_tree into update_tree and add_items. The tree now uses a
1911 more generic way to display the contents of the tree.
1912 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
1913
1914 * Thuban/Model/layer.py (Layer.TreeInfo),
1915 Thuban/Model/extension.py (Extension.TreeInfo),
1916 Thuban/Model/map.py (Map.TreeInfo),
1917 Thuban/Model/session.py (Session.TreeInfo):
1918 Add TreeInfo methods to implement the new tree view update scheme
1919
1920 2002-07-16 Bernhard Herzog <[email protected]>
1921
1922 * Thuban/UI/application.py: Don't use "import from" for the
1923 MainWindow. It can't always be resolved.
1924 (ThubanApplication.OnInit): change reference to MainWindow
1925 accordingly.
1926
1927 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
1928 completely
1929
1930 2002-07-10 Bernhard Herzog <[email protected]>
1931
1932 * setup.py (create_init_module): New configurable variable whose
1933 default depends on the platform we're running on.
1934 (ThubanInstall.initialize_options): Initialize
1935 self.create_init_module from the global create_init_module
1936 (ThubanInstall.user_options): indictate that the options
1937 create-init-module and init-module-dir have arguments.
1938
1939 * setup.py: In the setup call change the version number to include
1940 cvs.
1941
1942 * MANIFEST.in: Add the files in Examples
1943
1944 2002-07-09 Bernhard Herzog <[email protected]>
1945
1946 * setup.py: In the setup call, use the thuban homepage as the
1947 value of the url parameter.
1948
1949 * Examples: New subdirectory for examples.
1950
1951 * Examples/simple_extensions/simple_tool.xpm,
1952 Examples/simple_extensions/simple_tool.py,
1953 Examples/simple_extensions/simple_command.py,
1954 Examples/simple_extensions/README: Simple examples showing how to
1955 add new commands and tools.
1956
1957 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
1958 bdist_rpm that we also have an install script.
1959 (bdist_inno): Add 2002 to the copyright notice.
1960
1961 * setup.py: Create a file in python's site-packages directory to
1962 make installation of Thuban as a library easier.
1963 (ThubanInstall.user_options): Add two new options,
1964 create-init-module and init-module-dir
1965 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
1966 filenames for installation in the default directories.
1967 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
1968 the inherited methods to capture some filenames before they're
1969 transformed too much by distutils.
1970 (ThubanInstall.run): Create the init module if requested.
1971 (ThubanInstall.thuban_init_filename): New method to return the
1972 full name of the init module.
1973 (ThubanInstall.get_outputs): Append the filename of the init
1974 module.
1975
1976 2002-07-08 Bernhard Herzog <[email protected]>
1977
1978 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
1979 handle the prefix properly which means that the default for the
1980 installation prefix should be /usr for RPMs and /usr/local when
1981 doing a normal source install.
1982 (bdist_rpm_install_script): Script to override the default install
1983 commands in the specfile generated by the bdist_rpm command.
1984 (thuban_bdist_rpm.user_options): Add a prefix option
1985 (thuban_bdist_rpm.initialize_options): Init the prefix option.
1986 Create the script files for the spec files as empty files here
1987 (thuban_bdist_rpm._make_spec_file): Override the inherited method
1988 to fill the script files with content.
1989
1990 * Thuban/Model/save.py (relative_filename): Wrapper around
1991 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
1992 argument. save_session now automatically uses this version,
1993 solving a problem when saving to a relative filename.
1994
1995 * setup.py: In the setup call, make sure that the library
1996 directories are under $prefix/lib not directly under $prefix.
1997
1998 2002-06-20 Jan-Oliver Wagner <[email protected]>
1999
2000 * Thuban/Model/extension.py: new module to handle extension objects.
2001 * Thuban/Model/messages.py: new messages for extensions.
2002 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
2003 Session.AddExtension): new for handling extensions.
2004 Also some other minor changes to round up extension handling.
2005 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
2006 of Extension titles and title and names of its objects.
2007
2008 2002-05-29 Bernhard Herzog <[email protected]>
2009
2010 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
2011 the events for a command.
2012 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
2013 Call bind_command_events to bind the events. add_toolbar_command
2014 can now bind events too so that it's possible to have commands
2015 that are only available through the toolbar.
2016 (MainWindow.init_ids): New instance variable events_bound to keep
2017 track of for which commands events have been bound.
2018
2019 2002-05-28 Bernhard Herzog <[email protected]>
2020
2021 * Thuban/UI/menu.py: New module to build and manage menus.
2022
2023 * Thuban/UI/mainwindow.py: Remove some unused imports.
2024 (MainWindow.__init__, main_menu): move the definition of the main
2025 menu from __init__ to the Menu instance main_menu.
2026 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
2027 build the menu bar and sub-menus from a menu description.
2028
2029 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
2030 startup file
2031 (ThubanApplication.read_startup_files): New method to run
2032 ~/.thuban/thubanstart.py
2033
2034 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
2035 Move the toolbar definition to the Menu instance main_toolbar.
2036 (MainWindow.build_toolbar): New method to build the toolbar
2037 similar to the build_menu methods
2038
2039 2002-05-23 Bernhard Herzog <[email protected]>
2040
2041 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
2042 layer_outline_color. Fix it in the definition of the command too.
2043
2044 * Thuban/UI/command.py (Command): Fix typo in doc string
2045
2046 2002-05-22 Bernhard Herzog <[email protected]>
2047
2048 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
2049 in the docstring
2050
2051 2002-05-15 Bernhard Herzog <[email protected]>
2052
2053 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
2054 when the shapefile is empty.
2055 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
2056 now return None for empty shapefiles. Update doc-strings.
2057
2058 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
2059 the layer's bbox being None.
2060
2061 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
2062 layer's bbox being None.
2063
2064 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
2065 necessary.
2066 (MapCanvas.__init__): New instance variables, last_selected_layer
2067 and last_selected_shape to determine how the selection has
2068 changed.
2069
2070 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
2071 AutoSizeColumns because it will cause a traversal of the entire
2072 table which for large .dbf files will take a very long time.
2073
2074 2002-05-14 Bernhard Herzog <[email protected]>
2075
2076 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
2077 maximum depth for the tree than shapelib does by default.
2078
2079 2002-05-10 Bernhard Herzog <[email protected]>
2080
2081 * setup.py (py_modules): The shptree modules doesn't have a
2082 wrapper, so don't include it in the py_modules
2083
2084 2002-05-08 Bernhard Herzog <[email protected]>
2085
2086 * extensions/shapelib/shptree.c (compare_ints): Make arguments
2087 const void * as in the qsort prototype
2088 (SHPTreeFindLikelyShapes): Remove some unused variables.
2089
2090 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
2091 maintains to redraw the window during a drag.
2092 (MapCanvas.unprojected_rect_around_point): New method to determine
2093 a small region around a point for hit-testing.
2094 (MapCanvas.find_shape_at): Only test the shapes in a small region
2095 around the point.
2096
2097 * setup.py: Increment the version to 0.1.2
2098
2099 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
2100 debug print and set session to None after unsubscribing
2101
2102 2002-05-07 Bernhard Herzog <[email protected]>
2103
2104 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
2105 the file to have a .thuban extension.
2106
2107 * Thuban/UI/tree.py (session_channels): New class constant with
2108 all the session channels to subscribe to to update the tree
2109 (SessionTreeCtrl.session_changed): Remember the session so that we
2110 can unsubscribe properly. Use the new class constant to
2111 unsubscribe from the old session and subscribe to the new one.
2112 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
2113 subscriptions of the SessionTreeCtrl.
2114 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
2115
2116 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
2117 Session Tree" command to the file menu.
2118
2119 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
2120 as update_region to the renderer.
2121
2122 * Thuban/UI/renderer.py
2123 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
2124 update box is now directly a tuple, not a wxRect anymore.
2125
2126 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
2127 prints.
2128
2129 2002-05-07 Bernhard Herzog <[email protected]>
2130
2131 * setup.py: Add the shptree extension module. See
2132 extensions/pyshapelib/ChangeLog for more details.
2133
2134 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
2135 extensions/shapelib/dbfopen.c: Really update to the versions of
2136 shapelib 1.2.9. For some reason it wasn't really done on
2137 2002-04-11.
2138
2139 * extensions/shapelib/shptree.c: Modified version of shptree.c of
2140 shapelib 1.2.9. The only real difference is the use of qsort
2141 instead of a bubble sort implementation
2142
2143 * Thuban/Model/layer.py (Layer.__init__): New instance variable
2144 shapetree to hold the shapelib quadtree for the shapefile
2145 (Layer.open_shapefile): Create the quad tree.
2146 (Layer.ShapesInRegion): New method to return the ids of shapes in
2147 a given region using the quad tree.
2148
2149 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
2150 comment
2151 (draw_polygon_shape): Accept both arcs and polygons.
2152 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
2153 the api.
2154
2155 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
2156 return the shape ids to be rendered in a given layer.
2157 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
2158 ids. Use draw_polygon_shape to draw arc shapes as well.
2159 (ScreenRenderer.RenderMap): New parameter for the rectangle that
2160 has to be updated
2161 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
2162 calling it's ShapesInRegion method.
2163
2164 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2165 update_region for the update region.
2166 (MapCanvas.OnPaint): Maintain the update region
2167 (MapCanvas.do_redraw): Pass the bounding box of the update_region
2168 to the renderer when drawing the bitmap. Reset the update_region.
2169
2170 2002-05-03 Bernhard Herzog <[email protected]>
2171
2172 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
2173 MainWindow.OpenSession): Change the file extension of the session
2174 files to .thuban
2175
2176 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
2177 Move the map channels to be forwarded by the session into the
2178 class constant with forwarded_channels. Also add
2179 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
2180 forwarded_channels
2181
2182 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
2183 typo and some rewording).
2184
2185 2002-05-02 Bernhard Herzog <[email protected]>
2186
2187 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
2188 around to speed up most redraws:
2189 (MapCanvas.__init__): New instance variable bitmap which holds the
2190 bitmap
2191 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
2192 self.bitmap to draw.
2193 (MapCanvas.full_redraw): New method to force a full redraw
2194 including the bitmap
2195 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
2196 make sure the bitmap is redrawn.
2197 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
2198 MapCanvas.shape_selected): Call full_redraw instead of readraw to
2199 make sure the bitmap is redrawn.
2200 (MapCanvas.OnSize): New method to handle size events so that the
2201 bitmap can be redrawn.
2202
2203 2002-04-29 Bernhard Herzog <[email protected]>
2204
2205 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
2206 canvas' VIEW_POSITION event
2207 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
2208 Update the text in the status-bar accordingly.
2209
2210 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
2211 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
2212 called.
2213 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
2214 current_position
2215 (MapCanvas.set_current_position): New method to set
2216 current_position. Issue a VIEW_POSITION event
2217 (MapCanvas.CurrentPosition): New public method to return the value
2218 of current_position. Should be called when the VIEW_POSITION event
2219 is processed.
2220 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
2221 Update the position.
2222 (MapCanvas.OnLeaveWindow): Set the position to None.
2223
2224 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
2225 position in the statusbar
2226
2227 2002-04-26 Frank Koormann <[email protected]>
2228
2229 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
2230
2231 2002-04-24 Frank Koormann <[email protected]>
2232
2233 * Resources/Bitmaps/identify.xpm: shadow added
2234
2235 * Resources/Bitmaps/fullextent.xpm: new
2236
2237 2002-04-22 Jan-Oliver Wagner <[email protected]>
2238
2239 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
2240 box
2241
2242 2002-04-21 Jan-Oliver Wagner <[email protected]>
2243
2244 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
2245
2246 * Thuban/UI/tree.py (update_tree): added added map extent
2247
2248 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
2249 icon; added map_full_extend as tool
2250
2251 2002-04-19 Jan-Oliver Wagner <[email protected]>
2252
2253 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
2254 saving _new_ sessions
2255
2256 * Thuban/Model/session.py (create_empty_session): new session
2257 don't have a filename (set to None)
2258
2259 * Thuban/UI/tree.py (update_tree): added filename and modified flag
2260
2261 * Thuban/Model/load.py (ProcessSession): convert projection
2262 parameters from unicode to regular string
2263
2264 * Data/iceland_sample.session: Added UTM Zone 26 projection.
2265
2266 2002-04-11 Bernhard Herzog <[email protected]>
2267
2268 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
2269 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
2270 1.2.9
2271
2272 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
2273 the pyshapelib directoy into the list of include dirs, so that
2274 pyshapelib_api.h can be found.
2275
2276 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
2277 holds the pyshapelib C-API
2278 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
2279 pyshapelib_api to access the shapelib functions.
2280 (initwxproj): Import the c_api from the shapelib module and
2281 initialize pyshapelib_api.
2282
2283 2002-04-04 Bernhard Herzog <[email protected]>
2284
2285 * setup.py (thuban_bdist_rpm.initialize_options): Use
2286 initialize_options to create the scripts for the rpm.
2287
2288 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
2289
2290 2002-04-03 Bernhard Herzog <[email protected]>
2291
2292 * setup.py: Increment version to 0.1.1
2293
2294 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
2295 Layer" and "Remove Layer" commands from the layer menu to the map
2296 menu
2297
2298 2002-02-15 Bernhard Herzog <[email protected]>
2299
2300 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
2301 argument (python <= 1.5.2 erroneously accepted multiuple
2302 arguments)
2303
2304 2002-02-04 Bernhard Herzog <[email protected]>
2305
2306 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
2307 RecordGrid in the identifyview.
2308 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
2309 IdentifyListCtrl. The grid allows editing of the values.
2310
2311 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
2312 implementing a grid for a single row of a thuban table.
2313
2314 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
2315 layers by default. Easier to use than the previous default of only
2316 searching through the select layer which meant that if no layer
2317 was selected, you couldn't select a shape.
2318
2319 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
2320
2321 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
2322 stroke_width attribute
2323
2324 * Thuban/Model/save.py (save_session): Write the new stroke_width
2325 attribute
2326
2327 * Thuban/Model/load.py (ProcessSession.startElement): Read the
2328 stroke_width attribute
2329
2330 * Thuban/Model/layer.py (Layer.__init__): New parameter and
2331 instance variable stroke_width
2332 (Layer.SetStrokeWidth): Set the stroke_width.
2333
2334 2002-02-01 Bernhard Herzog <[email protected]>
2335
2336 * extensions/thuban/wxproj.cpp (project_points): Fix two
2337 off-by-one errors in the last loop that joins the various parts
2338 together.
2339
2340 2002-01-14 Bernhard Herzog <[email protected]>
2341
2342 * setup.py (data_dist.make_distribution): Fix some typos
2343
2344 2001-09-18 Bernhard Herzog <[email protected]>
2345
2346 * README: Slight tweaking in preparation for the 0.1 release
2347
2348 * setup.cfg: Add section for sdist to create both tgz and zip
2349 archives
2350
2351 * setup.py: increase version number to 0.1
2352 (data_dist): New command class for data distribution
2353
2354 2001-09-14 Bernhard Herzog <[email protected]>
2355
2356 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
2357 Handle the case of no layer (i.e. layer is None) properly.
2358
2359 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
2360 Set the initial selection of the combo boxes to reflect the
2361 projection we're starting with in a way that works on windows,
2362 too.
2363
2364 * Thuban/Lib/connector.py (Connector.print_connections): Print the
2365 puiblisher's ids in hex to make it easier to compare them to the
2366 standard repr of python methods
2367
2368 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
2369 messages
2370
2371 2001-09-13 Bernhard Herzog <[email protected]>
2372
2373 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
2374 deselect the layer if no layer is selected
2375
2376 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
2377 idle time when there actually is something to draw. If there's
2378 nothing to draw simply clear the window
2379 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
2380 (MapCanvas.SetMap): force a redraw in all cases because
2381 FitMapToWindow doesn't always do it.
2382 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
2383 specify the point to move into the center of the window
2384 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
2385 dragged, zoon in/out by a factor of 2
2386 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
2387 index, i.e. reversed drawing order) so that objects appearing to
2388 be in from of others are selected first. This is probably mostly
2389 relevant for point shapes where the symbols used may overlap
2390
2391 * Thuban/Model/session.py (create_empty_session): Unset the
2392 modified bit before returning it
2393
2394 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
2395 create_empty_session session to create the new, empty session.
2396
2397 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
2398 the tool bitmaps.
2399 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
2400 the code that asks whether the session should be saved into the
2401 new method save_modified_session.
2402 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
2403 method to save modified session here too.
2404
2405 2001-09-11 Bernhard Herzog <[email protected]>
2406
2407 * setup.py (InnoIconItem): fix typo
2408
2409 (thuban_bdist_inno.run):
2410 (bdist_inno.run): Move the decision not to create symlinks on
2411 non-nt platforms to thuban_bdist_inno and do it unconditinally
2412 since we never want to create the symlinks here
2413
2414 2001-09-10 Bernhard Herzog <[email protected]>
2415
2416 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
2417 identify view immediately
2418
2419 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
2420 and SelectableRecordListCtrl that implement the code shared by the
2421 identify view and the label dialog
2422
2423 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
2424 new class RecordListCtrl
2425
2426 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
2427 return value of GetValue is None instead of using it as a boolean
2428 directly so that Zero numbers are handled properly.
2429 (LabelListCtrl): Derive from the new class
2430 SelectableRecordListCtrl
2431
2432 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
2433 (Proj4Dialog.dialogLayout): Make the window resizable and set the
2434 size of the text control explicitly to make the sizers work on
2435 both Windows and X.
2436
2437 2001-09-07 Bernhard Herzog <[email protected]>
2438
2439 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
2440 that can limit the search to the currently selected layer.
2441 (MapCanvas.SelectShapeAt): Make sure that the currently selected
2442 layer stays selected even when no shape is found
2443 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
2444 height do nothing (avoids zero division errors)
2445
2446 2001-09-06 Bernhard Herzog <[email protected]>
2447
2448 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
2449 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
2450 convenient :-)
2451 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
2452 a new instvar layer_to_item to map layers to tree items
2453 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
2454 to match the current selection in the interactor
2455
2456 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
2457 (Interactor.HasSelectedLayer): New methods to query the current
2458 selection
2459
2460 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
2461 (MainWindow.has_selected_layer): Simply call the appropriate
2462 interactor method
2463
2464 * Thuban/UI/mainwindow.py (MainWindow.__init__):
2465 (MainWindow.LayerShowTable):
2466 (MainWindow.identify_view_on_demand): Store the interactor in an
2467 instvar and use that reference instead of going through main.app
2468
2469 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
2470 * Thuban/UI/application.py (ThubanApplication.OnInit):
2471 * Thuban/UI/main.py (main): Create the session tree view in main
2472 with the new mainwindow method ShowSessionTree and not directly
2473 the application's OnInit method
2474
2475 * Thuban/UI/tree.py (myTreeCtrlPanel):
2476 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
2477 TreeCtrl isntead of a panel. This affects most method since we now
2478 refer to self instead of self.tree
2479 (SessionTreeView): New class implementing a non-modal dialog
2480 showing the session tree.
2481
2482 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
2483 layer to the tableview dialog.
2484
2485 * Thuban/UI/tableview.py: Add some doc-strings
2486 (TableGrid):
2487 (TableGrid.OnRangeSelect):
2488 (TableGrid.OnSelectCell):
2489 (TableFrame.__init__):
2490 (TableFrame.row_selected):
2491 Selecting rows in the grid view now updates the selected shapes
2492 through the TableFrame. To achieve this we derive TableGrid from
2493 Publisher and introduce the message type ROW_SELECTED which the
2494 TableFrame subscribes to and which is issued by OnRangeSelect and
2495 OnSelectCell
2496
2497 (DataTable.SelectRow): Removed because it's no longer needed in
2498 the row/shape selection scheme
2499
2500 * Thuban/UI/dialogs.py: New file implementing common classes for
2501 dialogs
2502
2503 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
2504 the SELECTED_SHAPE message anymore. This is now handled by the
2505 parent.
2506 (TableGrid.select_shape): Only update the selection if the shape
2507 is not None.
2508 (TableFrame): Inherit from the new NonModalDialog class.
2509 (TableFrame.__init__, TableFrame.select_shape): Handle the
2510 SELECT_SHAPE message.
2511 (TableFrame.OnClose): Extend the inherited method to unsubscribe
2512 SELECT_SHAPE
2513
2514 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
2515 (MainWindow.add_dialog):
2516 (MainWindow.dialog_open):
2517 (MainWindow.remove_dialog):
2518 (MainWindow.get_open_dialog): New methods to maintain a dictionary
2519 of opened non-modal dialogs.
2520
2521 (MainWindow.__init__): Initialize the new non-modal dictionary
2522 management code
2523 (MainWindow.LayerShowTable): maintain separate dialogs for each
2524 table using the non-modal dialog management code to only open a
2525 view once for each table.
2526
2527 (MainWindow.IdentifyTool):
2528 (MainWindow.__init__):
2529 (MainWindow.identify_view_on_demand): Don't open the identify view
2530 in IdentifyTool anymore. This will be done automatically by the
2531 new method identify_view_on_demand which handles the
2532 SELECTED_SHAPE message so that the identify view will be opened on
2533 demand
2534
2535 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
2536 the interactor argument. The SELECTED_SHAPE message is now handled
2537 by the parent.
2538 (IdentifyView.__init__): Add the interactor argument so that we
2539 can handle the SELECTED_SHAPE message here
2540 (IdentifyView.selected_shape): New method to handle the
2541 SELECTED_SHAPE messages
2542
2543 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
2544 NonModalDialog class
2545 (IdentifyView.OnClose): Extend the inherited version to
2546 unsubscribe SELECT_SHAPE
2547
2548 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
2549
2550 2001-09-05 Bernhard Herzog <[email protected]>
2551
2552 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
2553
2554 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
2555 interactor to pass through to the MapCanvas
2556
2557 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
2558 argument to the MainWindow constructor to get rid of the ugly hack
2559 that made main.app available early just so that the mapcanvas
2560 could access the interactor object.
2561
2562 2001-09-04 Bernhard Herzog <[email protected]>
2563
2564 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
2565 that runs a modal message box
2566 (MainWindow.OnClose): Use the new method
2567 (MainWindow.RemoveLayer): Just do nothing in case no layer is
2568 selected. The command should be grayed out anyway, so there's no
2569 need to pop up a message box.
2570 (MainWindow.AddLayer): Pop up a message box with an error message
2571 if the shape file can't be opened
2572
2573 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
2574 immediately. This will cause an exception in case the file can't
2575 be opened and we can display an appropriate message.
2576
2577 * MANIFEST.in: Add extensions/pyprojection/LICENSE
2578
2579 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
2580 specific bdist_rpm command.
2581
2582 * Thuban/UI/main.py: Catch ImportError exceptions when importing
2583 the locale module because it may not be available on some
2584 installations.
2585
2586 * extensions/pyprojection/LICENSE: Copy of the license text in
2587 Projection.i. Having it in a separate file makes it easier to
2588 refer to license text in e.g. RPMs
2589
2590 2001-09-03 Bernhard Herzog <[email protected]>
2591
2592 * setup.py: use wx-config instead of wxgtk-config because it's
2593 more generic
2594
2595 * setup.py (ThubanInstall.get_outputs): Add the symlink in
2596 <prefix>/bin to the outputs
2597 (ThubanInstall.link_file): New method to link files. We need this
2598 because the standard copy_files refuses to link non-existing
2599 files.
2600 (ThubanInstall.run): Remove the leading install root from the
2601 script filename if an install root was specified and use the new
2602 link_file method
2603
2604 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
2605 the window when the first layer is added to the map.
2606
2607 * setup.py (ThubanInstall.run): Honor the build root (self.root)
2608 when linking thuban.py to <prefix>/bin
2609
2610 2001-08-31 Bernhard Herzog <[email protected]>
2611
2612 * setup.py: In the setup call, the install parameters shouldn't
2613 have trailing slashes because distutils on non-posix platforms
2614 doesn't like that. The same applies to other directories like
2615 "Resources/Bitmaps"
2616
2617 In the configuration section for nt, move the wxWindows directory
2618 optins into the part clearly marked as editable.
2619
2620 (InstallLocal.initialize_options):
2621 (InstallLocal.user_options): remove the currently unused debug
2622 flag
2623 (thuban_build_py.find_all_modules): Add this method so that it
2624 works for our case of having packages and modules in one
2625 distribution as well.
2626 (ThubanInstall.initialize_options):
2627 (ThubanInstall.finalize_options):
2628 (ThubanInstall.user_options):
2629 (ThubanInstall.boolean_options): Add new options, do-symlink and
2630 extra files. Since these are the first ThubanInstall specific
2631 options, override user_options and boolean_options
2632 (ThubanInstall.run): Honor the new do-symlink and extra-files
2633 options.
2634 (ThubanInstall.get_outputs): Add to override the base-class's
2635 version and add the extra-files to the outputs
2636 (bdist_inno): New class for windows distributions with Inno Setup
2637 (InnoIconItem): Helper class for bdist_inno
2638 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
2639 this together with the appropriate parameters, to the setup call.
2640
2641 * setup.cfg (bdist_inno): added new section for the inno setup
2642 installer
2643
2644 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
2645 changing_selection to avoid recursive selection events when
2646 modifying the selection in response to a selection event.
2647 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
2648 changing the tree's selection.
2649 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
2650 we're not being called indirectly from normalize_selection.
2651
2652 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
2653 event.Check only if the command is actuall checkable.
2654 (MainWindow.__init__): Call the toolbar's Realize method to make
2655 sure that the items are actually shown
2656
2657 2001-08-28 Bernhard Herzog <[email protected]>
2658
2659 * setup.py: Fix some doc strings
2660
2661 * ChangeLog: started
2662

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26