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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 817 - (hide annotations)
Mon May 5 15:05:36 2003 UTC (21 years, 10 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 119487 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26