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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.146  
changed lines
  Added in v.762

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26