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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 753 - (show annotations)
Fri Apr 25 14:23:41 2003 UTC (21 years, 10 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 107861 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26