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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 786 - (hide annotations)
Wed Apr 30 10:54:32 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 113232 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26