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

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

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

revision 278 by bh, Mon Aug 26 12:50:23 2002 UTC revision 1237 by jonathan, Wed Jun 18 15:30:14 2003 UTC
# Line 1  Line 1 
1    2003-06-18  Jonathan Coles   <[email protected]>
2    
3            When Thuban loaded the map was redrawn twice because the
4            legend was being opened after the mainwindow was created
5            and not during its creation. This meant the map was drawn
6            initially and then had to be redrawn when the legend
7            caused the display to change. Now the legend is opened
8            in the mainwindow constructor which resolves this issue.
9    
10            Also, although we were checking for the existence of
11            gdal and gdalwarp modules, the gdalwarp extension was
12            still being compiled (which may fail if the system doesn't
13            have gdal installed). the build_ext command to setup.py
14            now accepts the flags --with-gdal and --without-gdal.
15            If --without-gdal is specified setup.py will try to
16            use the gdal parameters specified by gdal-config. Under
17            windows, those parameters have to be set in setup.py
18            as with proj4 an wxWindows.
19    
20            * setup.py: Use a list instead of seperate variables for
21            extension parameters so we can create a generic function
22            that runs an appropriate *-config script.
23            (run_cs_script): Renamed from run_wx_script and modified
24            to accept a second argument which is a list of lists to
25            be filled in by the values returned from running the command.
26            (thuban_build_ext): New. Extends the build_ext command and
27            provides the options --with-gdal/--without-gdal which then
28            optionally includes the gdalwarp extension.
29    
30            * Thuban/Model/resource.py: First check if we can import
31            the gdalwarp Thuban extension before checking for gdal.
32            Also added some comments.
33            
34            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
35            the map is None which may be the case if none has been loaded
36            yet.
37    
38            * Thuban/UI/main.py (main): Remove call to ShowLegend.
39    
40            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
41    
42            * Thuban/UI/renderer.py: Check for gdal support before importing
43            gdalwarp.
44            (MapRenderer.render_map): Only try to optimize if we have gdal
45            support otherwise nothing will get drawn.
46    
47            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
48            during startup before a map has been created. Check if map is None
49            before using it and do nothing if it is.
50    
51    2003-06-17  Jonathan Coles   <[email protected]>
52    
53            Fix the problem with raster layers under Windows that caused
54            Thuban to crash. The view should respond to layer projection
55            changed events to update the display. Changes to a projection
56            should not cause the map to be set to full extent.
57            
58            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
59            current_map_proj to remember the current map projection so that
60            when the projection changes we know what the previous projection
61            was.
62            (MapCanvas.SetMap): Unsubscribe and subscribe to
63            LAYER_PROJECTION_CHANGED events.
64            (MapCanvas.projection_changed): Split into two methods that respond
65            to map and layer projection changes.
66            (MapCanvas.map_projection_changed): New. Takes the current view and
67            projects it using the new projection. This does not cause the
68            map to be redrawn at full extent.
69            (MapCanvas.layer_projection_changed): New. Cause a redraw which
70            will draw each layer in its new projection.
71            
72            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
73            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
74            under Windows.
75            
76            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
77            to twice sizeof(void*) because there are two digits for each
78            hex byte.
79    
80    2003-06-16  Bernhard Herzog  <[email protected]>
81    
82            Update to the layer interface: Direct access to the table,
83            shapetable, shapefile and filename attributes is now actively
84            deprecated by issuing deprecation warnings for all places where
85            this happens.
86    
87            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
88            to the instance variables table, shapetable, shapefile and
89            filename via __getattr__ so that we can issue a deprecation
90            warning.
91            (Layer.SetShapeStore): Don't set the deprecated instance variables
92            any more
93            (Layer.SetShapeStore): Don't use deprecated layer instance
94            variables
95            (Layer.Destroy): No need to explicitly remove the instance
96            variables any more
97            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
98            instance variables
99    
100            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
101            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
102            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
103            use deprecated layer instance variables
104    
105            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
106            deprecated layer instance variables
107    
108            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
109            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
110            instance variables
111    
112            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
113            deprecated layer instance variables
114    
115            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
116            deprecated layer instance variables
117    
118            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
119            deprecated layer instance variables
120    
121            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
122            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
123            variables
124    
125            * test/runtests.py (main): Turn Thuban's deprecation warnings into
126            errors so that they're cought by the tests
127    
128            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
129            layer instance variables
130    
131    2003-06-16  Jonathan Coles   <[email protected]>
132    
133            Fix a problem under Windows whereby if the user double-clicks on a
134            layer in the legend that tree item will expand or collapse as well
135            as open the layer properties dialog. The state of the tree item
136            should not be affected.
137    
138            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
139            preventExpandCollapse and subscribe to expanding and collapsing
140            events.
141            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
142            collapsing events and will veto the event if it has been triggered
143            by the user double clicking on a layer.
144            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
145            that an expanding/collapsing event should be vetoed.
146    
147    2003-06-13  Bernhard Herzog  <[email protected]>
148    
149            * Thuban/UI/classifier.py (Classifier.OnClose)
150            (Classifier.map_layers_removed)
151            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
152            in OnClose and not in map_layers_removed or
153            layer_shapestore_replaced to make sure it always happens when the
154            dialog is closed
155    
156    2003-06-13  Jonathan Coles   <[email protected]>
157    
158            This puts back a fix for Windows where a panel is needed so that
159            the background of the table view appears correctly.
160    
161            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
162            object that can be used by derived classes to place any
163            controls (including the grid) onto.
164            (QueryTableFrame.__init__): Use the panel as the parent window
165            for all the controls. Reparent the grid so that the panel is
166            the parent. Call UpdateStatusText() to correctly initialize
167            the status bar.
168    
169    2003-06-13  Jonathan Coles   <[email protected]>
170    
171            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
172            from wxFrame (as opposed to wxDialog like the other classes)
173            but otherwise behaves like the other classes. This is needed
174            for the TableView which isn't really a dialog and needs to
175            have a status bar and control buttons.
176    
177            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
178            instance variable to keep track of how many rows are selected.
179            Subscribe once to the the events we are interested in.
180            (ThubanGrid.OnRangeSelect): Only handle event if event handling
181            hasn't been turned off.
182            (ThubanGrid.OnSelectCell): Only handle event if event handling
183            hasn't been turned off.
184            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
185            as an event listener (which changes the event handler stack)
186            simply set an instance variable to False. This is checked in
187            the event handlers.
188            (ThubanGrid.GetNumberSelected): Return the number of currently
189            selected rows.
190            (TableFrame): Inherit from ThubanFrame so we can have a
191            status bar and control buttons.
192            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
193            Explicitly set which items are selected in the operator choice and
194            action choice so there is always a valid selection. Fixes RTbug #1941.
195            Subscribe to grid cell selection events so we can update the
196            status bar.
197            (QueryTableFrame.UpdateStatusText): Update the status bar with
198            how many rows are in the grid, how many columns, and how many
199            rows are selected.
200            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
201            Call UpdateStatusText when cells are (de)selected.
202            (QueryTableFrame.OnQuery): Use the string value in the value
203            combo if either the selected item index is 0 or if the string
204            cannot be found in the predefined list (this happens if the
205            user changes the text). Fixes RTbug #1940.
206            Only turn off the grid event listeners if there a query comes
207            back with a none empty list of ids. in the case that the list
208            is empty this causes a grid.ClearSelection() call to actually
209            clear the grid selection which causes the selected items in
210            the map to be deselected. Fixes RTbug #1939.
211    
212            * test/test_save.py (XMLWriterTest.Encode): Check return values.
213            Fixes RTbug #1851.
214    
215    2003-06-13  Bernhard Herzog  <[email protected]>
216    
217            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
218            self.selected_shape with the current selection to make sure the
219            contents of the dialog are up to date when it's shown for the
220            first time.
221            The dialog used to work without this by luck. The recent fix to
222            the connector module 'broke' a 'feature' the identify view was
223            relying on, i.e that subscribing to a message in response to
224            receiving a message of that type would mean that the new
225            subscriber would also be called for the same message.
226            
227    2003-06-12  Jonathan Coles   <[email protected]>
228    
229            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
230            the image is rendered. Fixes RTbug #1937.
231    
232    2003-06-12  Jonathan Coles   <[email protected]>
233    
234            * Thuban/Lib/fileutil.py: As is done under Windows, create the
235            user directory if it doesn't exist on a posix system.
236            Fixes RTbug #1815.
237    
238            * Thuban/Model/resource.py (get_user_proj_files): Moved the
239            called to get_application_dir here, so that the directory
240            will only be called if this method is invoked.
241    
242            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
243            the projfilepath if no projection is selected.
244    
245    2003-06-12  Jonathan Coles   <[email protected]>
246    
247            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
248            the scalebar if the current map has no projection set.
249    
250            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
251            projfilepath label to just the basename of the projection file
252            rather than include the entire path.
253    
254            * Thuban/Model/resource.py: Fix missed proj functions that
255            needed to be renamed.
256    
257    2003-06-12  Jonathan Coles   <[email protected]>
258    
259            * Thuban/Model/classification.py: Removed assert statements that
260            tested if the variable was an instance of Color.
261    
262            * Thuban/Model/color.py (Color): Remove commented code that isn't
263            used.
264            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
265            Fixes RTbug #1835.
266            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
267            Needed now that the class doesn't inherit from Color.
268    
269    2003-06-12  Jonathan Coles   <[email protected]>
270    
271            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
272            check unicode strings.
273    
274            * test/test_layer.py: Check for existence of gdal.
275    
276    2003-06-12  Jonathan Coles   <[email protected]>
277        
278            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
279            that was in load.py
280    
281            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
282            that was in save.py
283    
284    2003-06-12  Jonathan Coles   <[email protected]>
285    
286            This is largely a collection of bug fixes. We also handle the
287            case where gdal is not on the system. The XMLReader and XMLWriter
288            classes were moved into there own files to resolve some circular
289            import references and because they shouldn't really be in the
290            file that is dediciated to reading/writing session files since
291            they are also used elsewhere.
292    
293            * Thuban/Model/classgen.py: Renamed functions to follow the
294            function_names_with_underscores style. Fixes RTbug #1903.
295            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
296    
297            * Thuban/Model/layer.py: Import gdal only if it available.
298            (RasterLayer): Handle the case where the gdal library is unavailable.
299            Addresses RTbug #1877.
300    
301            * Thuban/Model/load.py (XMLReader): Moved into seperate file
302            xmlreader.py.
303    
304    2003-06-12  Jonathan Coles   <[email protected]>
305    
306            This is largely a collection of bug fixes. We also handle the
307            case where gdal is not on the system. The XMLReader and XMLWriter
308            classes were moved into there own files to resolve some circular
309            import references and because they shouldn't really be in the
310            file that is dediciated to reading/writing session files since
311            they are also used elsewhere.
312    
313            * Thuban/Model/classgen.py: Renamed functions to follow the
314            function_names_with_underscores style. Fixes RTbug #1903.
315            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
316    
317            * Thuban/Model/layer.py: Import gdal only if it available.
318            (RasterLayer): Handle the case where the gdal library is unavailable.
319            Addresses RTbug #1877.
320    
321            * Thuban/Model/load.py (XMLReader): Moved into seperate file
322            xmlreader.py.
323    
324            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
325            file xmlwriter.py.
326    
327            * Thuban/Model/resource.py: Renamed functions to following the
328            function_names_with_underscores style.
329            (has_gdal_support): New function that returns true if the gdal
330            library is available. Addresses RTbug #1877.
331    
332            * Thuban/UI/application.py (ThubanApplication.OpenSession):
333            Display a message box if the gdal library is not available, but
334            only if there are any layers that would use it. Addresses RTbug #1877.
335    
336            * Thuban/UI/classgen.py: Use renamed projection resource functions.
337            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
338            when using integers versus floats.
339    
340            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
341            determine if the "Add Image Layer" menu option should be
342            greyed out or not. Addresses RTbug #1877.
343    
344            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
345    
346            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
347            optimize if a raster layer is visible. Fixes RTbug #1931.
348            Only draw the raster layer if the gdal library is available.
349            Addresses RTbug #1877.
350    
351            * test/test_classgen.py: Add tests for generate_singletons,
352            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
353            (test_calculate_quantiles): Fix some tests to catch the new
354            ValueError that is raised.
355    
356            * test/test_proj.py: Use renamed projection resource functions.
357    
358            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
359            test for saving classified layers. Fixes RTbug #1902.
360            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
361    
362    2003-06-12  Jan-Oliver Wagner <[email protected]>
363    
364            Fix for http://intevation.de/rt/webrt?serial_num=1900.
365    
366            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
367    
368            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
369            multiplechoicedialog.py rather than from the wxPython library.
370    
371    2003-06-11  Frank Koormann  <[email protected]>
372    
373            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
374            update.
375    
376    2003-06-11  Frank Koormann  <[email protected]>
377    
378            * Thuban/Lib/fileutil.py (get_application_dir): New function to
379            determine the absolute .thuban/thuban directory under
380            "posix" (os.expanduser) and "nt" (read AppData registry key).
381    
382            * Thuban/Model/resource.py: Use get_application_dir
383    
384            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
385            Use get_application_dir.
386    
387    2003-06-10  Bernhard Herzog  <[email protected]>
388    
389            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
390            the messages MAP_LAYERS_REMOVED messages
391            (LayerTableFrame.OnClose): Unsubscribe from it.
392            (LayerTableFrame.map_layers_removed): New. Receiver for
393            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
394            dialog is showing is removed.
395    
396    2003-06-10  Bernhard Herzog  <[email protected]>
397    
398            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
399            of the receivers list so that unsubscribing in a receiver doesn't
400            modify it while iterating over it.
401    
402            * test/test_connector.py
403            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
404            unsubscribing in a receiver works correctly. See docstring for
405            details
406    
407    2003-06-10  Bernhard Herzog  <[email protected]>
408    
409            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
410            message.
411    
412            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
413            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
414            LAYER_CHANGED will still be sent if the classification changes.
415    
416            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
417            parameter so we can subscribe to some of its messages
418            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
419            and the layer's LAYER_SHAPESTORE_REPLACED
420            (Classifier.unsubscribe_messages): New. Unsubscribe from message
421            subscribed to in __init__
422            (Classifier.map_layers_removed)
423            (Classifier.layer_shapestore_replaced): receivers for the messages
424            subscribed to in __init__. Unsubscribe and close the dialog
425    
426            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
427            the map to the Classifier dialog
428    
429            * test/test_layer.py (SetShapeStoreTests): Derive from
430            SubscriberMixin as well so we can test messages
431            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
432            messages
433            (SetShapeStoreTests.tearDown): Clear the messages again
434            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
435            for the modified flag too
436            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
437            to check whether SetShapeStore sets the modified flag
438            (SetShapeStoreTests.test_set_shape_store_different_field_name)
439            (SetShapeStoreTests.test_set_shape_store_same_field)
440            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
441            Add tests for the messages. This checks both the new
442            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
443    
444    2003-06-06  Jan-Oliver Wagner <[email protected]>
445    
446            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
447            the menu items.
448    
449    2003-06-05  Frank Koormann  <[email protected]>
450    
451            * Thuban/UI/identifyview.py (IdentifyView.__init__):
452            Layout reimplemented without panel. Make life easier to fit the list
453            in the dialog.
454    
455    2003-06-05  Frank Koormann  <[email protected]>
456    
457            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
458            once on initialisation (Former implementation resulted in multiple
459            entries for each projection).
460            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
461            if set, select the projection found under the specified name. This
462            overwrites any other selection estimate.
463            Removed projchoice filling from this method.
464            (ProjFrame._OnSave, ProjFrame._OnAddToList):
465            Updated call of ProjFrame.__FillAvailList
466            (LCCPanel._DoLayout): Moved parameter controls in more common order.
467    
468            * Resources/Projections/defaults.proj: Extended defaults representing
469            various common European projections.
470    
471    2003-06-05  Frank Koormann  <[email protected]>
472    
473            * Thuban/UI/identifyview.py (IdentifyView.__init__):
474            Use ListCtrl instead of GridCtrl
475    
476            * Thuban/Model/resource.py:
477            Guess location of .thuban directory from tempdir parent directory.
478    
479            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
480            Guess location of .thuban directory from tempdir parent directory.
481    
482    2003-06-04  Bernhard Herzog  <[email protected]>
483    
484            Do not cache the values returned by the tree widget's
485            GetFirstChild and GetNextChild methods because it led to lots of
486            segfaults. The new way requires more brute force but is more
487            reliable.
488    
489            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
490            variable layer2id
491            (LegendTree.find_layer): New method to do with brute force what
492            layer2id tried to accomplish
493            (LegendTree._OnMsgLayerChanged)
494            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
495            Use find_layer instead of layer2id
496            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
497            update layer2id anymore
498            (LegendTree._OnMsgMapLayersRemoved)
499            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
500    
501    2003-06-03  Thomas Koester  <[email protected]>
502    
503            * Thuban/Model/classgen.py (GenQuantiles0): New function.
504    
505    2003-06-02  Bernhard Herzog  <[email protected]>
506    
507            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
508            New commands.
509            (main_menu): Add the new commands.
510            (MainWindow.TableRename): New. Implementation of the table_rename
511            command.
512            (MainWindow.RenameLayer): New. Implementation of the layer_rename
513            command.
514    
515            * Thuban/Model/session.py (Session.AddTable): call self.changed to
516            set the modified flag
517    
518            * test/test_session.py (TestSessionSimple.test_add_table): Test
519            whether the modified flag is set properly
520    
521            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
522            instead of issue so that the modified flags get updated.
523    
524            * test/test_base.py (SomeTitledObject): Derive from Modifiable
525            instead of Publisher to reflect reality better and to accomodate
526            the fact that SetTitle now calls changed instead of issue
527    
528    2003-06-02  Bernhard Herzog  <[email protected]>
529    
530            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
531            acquisition has to happen before the try in a try-finally.
532    
533    2003-06-02  Bernhard Herzog  <[email protected]>
534    
535            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
536            possible that a layer is removed that is not currently selected in
537            the legend so don't check for this.
538    
539    2003-05-30  Bernhard Herzog  <[email protected]>
540    
541            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
542            variables to None that have direct or indirect references to
543            shapefiles or dbf files to make sure that they do go away and the
544            files are closed.
545    
546    2003-05-30  Bernhard Herzog  <[email protected]>
547    
548            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
549            availImgListIndices when a new image list is created
550            
551    2003-05-30  Bernhard Herzog  <[email protected]>
552    
553            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
554            changing_selection to indicate whether the LegendTree code itself
555            is currently changing the selection
556            (LegendTree.normalize_selection): New method to normalize the
557            selection by selecting the layer item even if the user clicked on
558            the classification.
559            (LegendTree._OnSelChanged): normalize the selection. This works
560            around a bug in wx which doesn't keep track of the selection
561            properly when subtrees are deleted.
562    
563    2003-05-30  Bernhard Herzog  <[email protected]>
564    
565            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
566            maximum and minimum scale factors.
567    
568            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
569            changes in classgen.py
570    
571    2003-05-30  Jonathan Coles   <[email protected]>
572    
573            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
574            all the methods functions. Fixes RTBug #1903.
575    
576            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
577            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
578            RTBug #1907.
579    
580            * Thuban/UI/classgen.py: Use classgen functions that were part
581            of the ClassGenerator class. Put try/finally blocks around
582            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
583            RTBug #1904.
584    
585            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
586    
587            * Thuban/UI/legend.py: The legend was cleared and repopulated any
588            time something changed which caused some state to be lost such
589            as which children were expanded or collapsed. Fixes RTBug #1901.
590            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
591            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
592            the legend but not in the map.
593            (LegendTree.__FillTree): Move main functionality out into smaller
594            methods that can be used by other methods.
595            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
596            if they are available.
597            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
598            that we override the wxTreeCtrl method. Iterate over children
599            and call __RemoveLayer.
600            (LegendTree.__AddLayer): New. Add a new layer to the legend.
601            (LegendTree.__RemoveLayer): Remove a layer from the legend.
602            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
603            Should only be called with the id of a layer branch.
604            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
605            Returns the root item or creates one if necessary.
606    
607            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
608            ProjectRasterFile with tuple arguments instead of strings.
609    
610            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
611            with try/finally. Fixes RTBug #1904.
612    
613            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
614            with try/finally. Fixes RTBug #1904.
615            (MapCanvas.FitSelectedToWindow): If a single point is selected
616            simply center it on the display. Fixes RTBug #1849.
617    
618            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
619            to be compiled as a standalone app. Now the code can only be
620            called from Python which simplifies the parameter passing.
621            (ProjectRasterFile): Handle Python arguments. Remove code that
622            checks for a destination dataset. Add more clean up code.
623    
624            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
625            TestMapWithContents.test_lower_layer_bottom):
626            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
627            Fixes RTBug #1907.
628    
629            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
630            extent to the map when the legend is toggled. Fixes RTBug #1881.
631    
632    2003-05-29  Jan-Oliver Wagner <[email protected]>
633    
634            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
635            unsubscribes all that is subcribed in __init__.
636    
637    2003-05-28  Bernhard Herzog  <[email protected]>
638    
639            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
640            (MainWindow.CanDuplicateLayer): New methods to implement the
641            Layer/Duplicate command.
642            (layer_duplicate command): New.
643            (main_menu): Add layer_duplicate to the Layer menu.
644    
645    2003-05-28  Bernhard Herzog  <[email protected]>
646    
647            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
648            renderer so that NULL/None values get displayed differently (by a
649            gray rectangle).
650            (TableGrid.__init__): Override the default renderers
651    
652    2003-05-28  Bernhard Herzog  <[email protected]>
653    
654            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
655            classification to "None" if the type of the field has changed.
656    
657            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
658            test for the Layer.SetShapeStore method
659    
660    2003-05-28  Jan-Oliver Wagner <[email protected]>
661    
662            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
663            does not necessarily have a filename).
664    
665    2003-05-28  Jan-Oliver Wagner <[email protected]>
666    
667            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
668            sort the selection list for the dialog.
669    
670    2003-05-28  Frank Koormann  <[email protected]>
671    
672            * extensions/thuban/wxproj.cpp
673            (project_point): Removed cast to int for projected point coordinates.
674            (shape_centroid): Return last point if all polygon vertices fall
675            to one point.
676    
677    2003-05-28  Bernhard Herzog  <[email protected]>
678    
679            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
680            with layers that don't have shapestores, i.e. raster layers.
681    
682    2003-05-28  Bernhard Herzog  <[email protected]>
683    
684            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
685            when determining the title from the filename.
686    
687            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
688            reflect changes in the way the title is derived from the filename
689    
690    2003-05-28  Frank Koormann  <[email protected]>
691    
692            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
693            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
694    
695    2003-05-27  Bernhard Herzog  <[email protected]>
696    
697            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
698            delegate SelectedLayer.
699            (MainWindow.LayerUnjoinTable): Implement.
700            (_can_unjoin): New. Helper function for the sensitivity of the
701            layer/unjoin command.
702    
703            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
704            (DerivedShapeStore.OrigShapeStore): New. Return the original
705            shapestore. Used to figure out how to unjoin.
706            (DerivedShapeStore.Shapefile): Fix a typo.
707    
708    2003-05-27  Bernhard Herzog  <[email protected]>
709    
710            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
711            well
712            (JoinDialog.__init__): Use the layer parameter and only build the
713            left choice when a layer is given
714            (JoinDialog.OnJoin): Handle layer joins as well
715            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
716            that the user selects the "Select..." item. The sensitivitly
717            updating is now in update_sensitivity
718            (JoinDialog.y): New method to refactor the sensitivity update of
719            the join button into its own method.
720    
721            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
722    
723    2003-05-27  Bernhard Herzog  <[email protected]>
724    
725            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
726            iff there are unreferenced tables in the session
727    
728    2003-05-27  Bernhard Herzog  <[email protected]>
729    
730            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
731    
732            * Thuban/Model/session.py (Session.UnreferencedTables): New method
733            to return tables that are not referenced by other tables or shape
734            stores and can be removed.
735            (Session.RemoveTable): Issue a TABLE_REMOVED message after
736            removing the table
737    
738            * Thuban/UI/mainwindow.py: Remove unused imports
739            (MainWindow.TableClose): Implement.
740    
741            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
742            messages so that the frame will be automatically closed when a new
743            session is opened or the table is removed.
744            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
745            __init__
746            (TableFrame.close_on_session_replaced)
747            (TableFrame.close_on_table_removed): New. Subscribers that close
748            the window
749    
750            * test/test_session.py (TestSessionMessages.test_remove_table)
751            (TestSessionSimple.test_remove_table): Move the test to
752            TestSessionSimple and add test for the TABLE_REMOVED message
753            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
754            (TestSessionSimple.test_unreferenced_tables) New. Test for the
755            UnreferencedTables method.
756            (UnreferencedTablesTests): New. Class with some more sophisticated
757            tests for UnreferencedTables.
758    
759    2003-05-27  Frank Koormann  <[email protected]>
760    
761            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
762            display has some unwanted side effects. Removed again.
763    
764    2003-05-27  Frank Koormann  <[email protected]>
765    
766            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
767    
768            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
769    
770    2003-05-27  Jan-Oliver Wagner <[email protected]>
771    
772            * test/test_menu.py (MenuTest.test): Added test for
773            Menu.RemoveItem().
774    
775            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
776            the menu.
777    
778    2003-05-27  Frank Koormann  <[email protected]>
779            
780            Nonmodal dialogs without parent (i.e. they can fall behind the main
781            window)
782    
783            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
784            all dialogs in the dialogs dictionary and the canvas.
785    
786            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
787            parent, i.e. can fall behind other windows.
788            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
789            dictionary before removing it.
790    
791            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
792    
793            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
794            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
795            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
796    
797    2003-05-27  Bernhard Herzog  <[email protected]>
798    
799            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
800            tableview dialog
801            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
802            Also, don't use the table's titles as the dialog names. The titles
803            aren't guaranteed to be unique.
804            (MainWindow.TableOpen): Open a table view dialog after opening the
805            table
806    
807    2003-05-27  Bernhard Herzog  <[email protected]>
808    
809            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
810            effect can be achieved by simply closing the window showing the
811            table.
812            (MainWindow.TableHide): Removed.
813            (main_menu): Removed "table_hide"
814    
815    2003-05-27  Frank Koormann  <[email protected]>
816    
817            Fix legend tree display problems under Win32
818    
819            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
820            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
821            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
822    
823            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
824    
825    2003-05-27  Jan-Oliver Wagner <[email protected]>
826    
827            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
828            'after' now allows to insert separators almost anywhere in the menu.
829    
830    2003-05-27  Frank Koormann  <[email protected]>
831    
832            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
833            "S" of selection box label to hint on hot key (Alt-S). Works under
834            Win32 but is ignored under GTK.
835    
836    2003-05-26  Frank Koormann  <[email protected]>
837    
838            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
839            Center Choices.
840    
841    2003-05-26  Bernhard Herzog  <[email protected]>
842    
843            Remove the Precision methods again. They're too DBF specific to be
844            part of the table interface and they're only used in table_to_dbf
845            anyway.
846            
847            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
848            fixed precision of 12 for doubles.
849            (TransientTableBase.Precision): Removed
850            (AutoTransientTable.Width): Delegate to self.table.
851    
852            * Thuban/Model/table.py (DBFTable.Precision)
853            (MemoryTable.Precision): Removed.
854            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
855            (table_to_dbf): Use a fixed precision of 12 for floats unless the
856            column object specifies something else.
857    
858            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
859            test for table_to_dbf
860    
861    2003-05-26  Bernhard Herzog  <[email protected]>
862    
863            * test/test_transientdb.py
864            (TestTransientTable.run_iceland_political_tests): Fix a comment.
865    
866    2003-05-26  Bernhard Herzog  <[email protected]>
867    
868            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
869            implementation. Mark parts of the file format strings for
870            localization.
871    
872            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
873            file and add the table to the tables managed by the session
874    
875            * test/test_session.py (TestSessionSimple.test_open_table_file):
876            New. test case for OpenTableFile
877    
878    2003-05-26  Jan-Oliver Wagner <[email protected]>
879    
880            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
881            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
882            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
883            Replace the true/false of wxWindows by True/False of Python 2.2.1.
884    
885    2003-05-26  Jan-Oliver Wagner <[email protected]>
886    
887            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
888            already a selection present, update the grid accordingly.
889    
890            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
891            resizeable and increase its initial size.
892    
893    2003-05-26  Frank Koormann  <[email protected]>
894    
895            Table export functionality
896    
897            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
898            Return width (in characters) for a column.
899            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
900            (table_to_dbf): Write table to dbf file.
901            (table_to_csv): Write table to csv file.
902    
903            * Thuban/Model/transientdb.py (TransientTableBase.Width,
904            TransientTableBase.Precision): Return column width and precision.
905    
906            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
907            or table_to_csv depending on file selection.
908    
909            * test/test_dbf_table.py:
910            Test table_to_dbf (extension of former part of test).
911    
912            * test/test_csv_table.py:
913            Test table_to_csv.
914    
915    2003-05-23  Jan-Oliver Wagner <[email protected]>
916    
917            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
918            Use QueryTableFrame instead of TableFrame.
919    
920            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
921            table window with 'Layer Table:' instead of 'Table:'.
922    
923    2003-05-23  Jan-Oliver Wagner <[email protected]>
924    
925            Give all tables a title via mix-in TitledObject.LayerShowTable
926    
927            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
928            only if it exists.
929    
930            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
931            and call its init-method with a default title. Remove Title() method.
932    
933            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
934            AutoTransientTable): mix-in TitledObject and call its init-method with
935            a default title. Remove Title() method.
936    
937    2003-05-23  Bernhard Herzog  <[email protected]>
938    
939            * Thuban/Model/session.py (Session.AddShapeStore): Define
940            AddShapeStore analogously to AddTable.
941    
942            * test/test_session.py (TestSessionSimple.test_add_shapestore):
943            New. Test for AddShapeStore
944    
945    2003-05-23  Jan-Oliver Wagner <[email protected]>
946    
947            Introducing QueryTableFrame and a very coarse ShowTable implementation.
948    
949            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
950            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
951            The latter implements the selection GUI without dependency on a layer.
952            LayerTableFrame now is derived from QueryTableFrame and connects
953            to a layer.
954    
955            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
956            implementation that still needs work.
957    
958            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
959    
960    2003-05-22  Frank Koormann  <[email protected]>
961    
962            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
963            Added "outer_join = False" as optional parameter.
964            (TransientJoinedTable.create): If outer join is true, perform a
965            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
966            the left table. Records not matching are filled with 0 / None.
967    
968            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
969            (JoinDialog.OnJoin): Consider outer join check box.
970    
971    2003-05-22  Bernhard Herzog  <[email protected]>
972    
973            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
974            somewhat safer way. Storing the traceback in a local variable can
975            lead to memory leaks
976    
977    2003-05-22  Bernhard Herzog  <[email protected]>
978    
979            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
980            the wxMessageDialog's Destroy() method.
981    
982    2003-05-22  Frank Koormann  <[email protected]>
983    
984            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
985            TransientTable.Title()
986    
987    2003-05-22  Frank Koormann  <[email protected]>
988    
989            Join Dialog, initial version.
990    
991            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
992    
993            * Thuban/UI/join.py (JoinDialog): Functional implementation of
994            former framework. Renamed Table1/Table2 to LeftTable/RightTable
995            in all occurences.
996    
997            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
998            Typo fixed.
999    
1000    2003-05-22  Bernhard Herzog  <[email protected]>
1001    
1002            Give the tables titles so that the GUI can display more meaningful
1003            names. For now the titles are fixed but depend on e.g. filenames
1004            or the titles of the joined tables.
1005    
1006            * Thuban/Model/transientdb.py (TransientTable.Title)
1007            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
1008    
1009            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
1010    
1011            * test/test_transientdb.py
1012            (TestTransientTable.test_auto_transient_table_title): New. Test
1013            for the Title method
1014            (TestTransientTable.test_transient_joined_table)
1015            (TestTransientTable.test_transient_table): Add test for the Title
1016            methods
1017    
1018            * test/test_memory_table.py (TestMemoryTable.test_title): New.
1019            Test for the Title method
1020    
1021            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
1022            the Title method
1023    
1024    2003-05-22  Bernhard Herzog  <[email protected]>
1025    
1026            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1027            Provide a better way to destroy the layers
1028            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
1029            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1030            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
1031            the new way to destroy the layers.
1032            (TestLayer.test_derived_store): New. Test for using a layer with a
1033            DerivedShapeStore
1034    
1035            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
1036            filename if the shape store actually has one.
1037    
1038    2003-05-22  Bernhard Herzog  <[email protected]>
1039    
1040            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
1041            for the filename
1042    
1043            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
1044            for the FileName method
1045            (TestDBFTableWriting.test_write): Fix spelling of filename
1046    
1047    2003-05-22  Thomas Koester  <[email protected]>
1048    
1049            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
1050            from SciParam that now really is immutable.
1051    
1052    2003-05-22  Frank Koormann  <[email protected]>
1053    
1054            Layer Top/Bottom placement added to legend.
1055    
1056            * Thuban/UI/legend.py
1057            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
1058            bound to tool events.
1059            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
1060            New, methods binding the event methods with the map methods.
1061    
1062            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
1063            layer at top/bottom of layer stack.
1064    
1065            * Resources/Bitmaps/top_layer.xpm: New button icon.
1066    
1067            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
1068    
1069    2003-05-22  Bernhard Herzog  <[email protected]>
1070    
1071            * Thuban/Model/session.py (Session.RemoveTable): New method to
1072            remove tables
1073    
1074            * test/test_session.py (TestSessionSimple.test_remove_table): New.
1075            Test for RemoveTable
1076    
1077    2003-05-22  Thomas Koester  <[email protected]>
1078    
1079            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
1080            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
1081    
1082    2003-05-22  Bernhard Herzog  <[email protected]>
1083    
1084            Implement a way to discover dependencies between tables and
1085            shapestores.
1086    
1087            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
1088            (TransientJoinedTable.Dependencies)
1089            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
1090            interface
1091            (TransientJoinedTable.__init__): Keep tack of the original table
1092            objects in addition to the corresponding transient tables.
1093    
1094            * Thuban/Model/table.py (DBFTable.Dependencies)
1095            (MemoryTable.Dependencies): New. Implement the dependencies
1096            interface
1097    
1098            * Thuban/Model/data.py (ShapeTable): New. Helper class for
1099            ShapefileStore
1100            (ShapefileStore.__init__): Use ShapeTable instead of
1101            AutoTransientTable
1102            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
1103            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
1104            methods for filename and type
1105            (ShapefileStore.Dependencies): New. Implement the dependencies
1106            interface
1107            (DerivedShapeStore): New class to replace SimpleStore. The main
1108            difference to SimpleStore is that it depends not on a shapefile
1109            but another shapestore which expresses the dependencies a bit
1110            better
1111            (SimpleStore.__init__): Add deprecation warning.
1112    
1113            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
1114            Test for the Dependencies method.
1115    
1116            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
1117            New. Test for the Dependencies method.
1118    
1119            * test/test_transientdb.py
1120            (TestTransientTable.test_auto_transient_table_dependencies): New.
1121            Test for the Dependencies method.
1122            (TestTransientTable.test_transient_joined_table): Add test for the
1123            Dependencies method.
1124    
1125            * test/test_session.py (TestSessionSimple.setUp)
1126            (TestSessionSimple.tearDown): New. Implement a better way to
1127            destroy the sessions.
1128            (TestSessionSimple.test_initial_state)
1129            (TestSessionSimple.test_add_table): Bind session to self.session
1130            so that it's destroyed by tearDown
1131            (TestSessionSimple.test_open_shapefile): New. Test for
1132            OpenShapefile and the object it returns
1133    
1134    2003-05-22  Bernhard Herzog  <[email protected]>
1135    
1136            * Thuban/Model/session.py (Session.AddTable): New method to
1137            register tables with the session.
1138            (Session.Tables): Return the tables registered with AddTable too.
1139    
1140            * test/test_session.py (TestSessionSimple.test_add_table): New.
1141            Test case for the AddTable method
1142    
1143    2003-05-22  Frank Koormann  <[email protected]>
1144    
1145            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
1146            lower right corner, center labels for selections, initialize controls
1147            in reasonable order for keyboard navigation.
1148    
1149            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
1150            (ProjFrame.__DoOnProjAvail): Determine position of current projection
1151            using the wxListBox.FindString() method. Still a problem (#1886)
1152    
1153            * Thuban/UI/classifier.py
1154            (Classifier.__init__, SelectPropertiesDialog.__init__)
1155    
1156            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
1157            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
1158            different classification types from here to __init__.
1159            (GenUniquePanel.__init__): Set the column width of the first field
1160            in the Field ListCtrl to the full width.
1161    
1162            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
1163            Button to 'Export'. Center Buttons in Selection Box, set Focus to
1164            Grid.
1165            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
1166            changes focus to the Selection when pressing "Alt-S".
1167    
1168            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
1169            the text if not visible. The italic font sometimes exceeds the
1170            rendering area.
1171    
1172    2003-05-21  Jonathan Coles   <[email protected]>
1173    
1174            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
1175            to OnClose so that Thuban closes correctly.
1176    
1177            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
1178            DockFrame.OnClose, not DockFrame._OnClose.
1179    
1180    2003-05-21  Jonathan Coles   <[email protected]>
1181    
1182            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1183            references to 'inf' and use new Range __init__ to pass floats
1184            directly rather than converting them to strings first.
1185            Fixes RTBug #1876.
1186    
1187            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1188            Use new Range ___init__ to pass floats.
1189    
1190            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1191            filename is a valid image file. Throw IOError otherwise.
1192    
1193            * Thuban/Model/range.py: Brought over new Range from SciParam that
1194            is immutable and has an __init__ which can accept floats.
1195    
1196            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1197            into try block. AddLayer doesn't throw any exceptions anymore.
1198            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1199            try block.
1200    
1201            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1202            the first item in choices. Fixes RTBug #1882.
1203    
1204            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1205            has gone to 0 which is a serious problem. abort.
1206            (MapRenderer.draw_raster_layer): Catch IOError seperately and
1207            print the error from GDAL.
1208    
1209            * Thuban/UI/tableview.py (TableGrid.__init__): Call
1210            ToggleEventListeners to turn on listening.
1211            (TableGrid.ToggleEventListeners): New. Turns event listening on
1212            and off so as to prevent excessive messages.
1213            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1214            to suppress excessive messages when selecting many rows.
1215            Fixes RTBug #1880.
1216    
1217            * Thuban/UI/view.py: Added checks against if scale == 0. This
1218            is a serious problem that can occur when an image without
1219            geo data is loading and causes the map projection bounds to
1220            go to infinity. Right now, the solution is to simply try
1221            to recover.
1222    
1223            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1224            to set the MFILEReceiver attributes even if the data is NULL.
1225    
1226            * extensions/thuban/gdalwarp.cpp: Improved the error handling
1227            and passed GDAL messages back up to the Python layer. Also
1228            tried to fix some memory leaks that were present in the original
1229            utility but didn't matter because the program aborted.
1230    
1231            * test/test_range.py: Copied over tests from SciParam. Removed
1232            tests against importing. Fixes RTBug #1867.
1233    
1234    2003-05-21  Bernhard Herzog  <[email protected]>
1235    
1236            * test/test_load.py: Remove unused imports and restructure the
1237            test code
1238            (LoadSessionTest): Split into one class for each test and turn
1239            LoadSessionTest itself into the base class for all such session
1240            tests.
1241            (ClassificationTest): New base class for load tests that test
1242            classifications
1243            (TestSingleLayer, TestLayerVisibility, TestClassification)
1244            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1245            for the individual tests
1246    
1247            * test/support.py (FileLoadTestCase.filename): New base class for
1248            file loading tests
1249    
1250    2003-05-21  Jan-Oliver Wagner <[email protected]>
1251    
1252            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1253            Mercator' to 'UTM Zone 32' as a more convenient example.
1254            Added 'Gauss Krueger Zone 6'.
1255    
1256            * Data/iceland_sample_raster.thuban: political polygon now
1257            filled transparent to have the raster image visible at once.
1258    
1259    2003-05-21  Frank Koormann  <[email protected]>
1260    
1261            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1262            OnClose() to keep in sync with extensions. Internally Thuban
1263            still uses "underscored" names.
1264    
1265    2003-05-20  Jonathan Coles   <[email protected]>
1266    
1267            This puts back Raster layer support. These layers support projections
1268            through the GDAL library. Currently, the CVS version is being used.
1269            There are no Debian packages available although this may change soon.
1270            A GDAL driver was extended to support writing to memory rather to
1271            files.
1272    
1273            There is still some work that needs to be done, such as some error
1274            handling when loading invalid images or when there is a problem
1275            projecting the image. This putback simply checks in the majority
1276            of the work.
1277    
1278            * setup.py: Add gdalwarp library extension.
1279    
1280            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1281            Defaults to False, but can be overridden by subclasses if they
1282            support classification.
1283            (RasterLayer): New. Defines a new layer that represents an
1284            image.
1285    
1286            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1287            tag handler.
1288            (SessionLoader.start_layer): Encode the filename.
1289            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1290            New. Supports reading a rasterlayer tag.
1291    
1292            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1293    
1294            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1295            get a string in Latin1. If we get such as string convert it to
1296            unicode first, otherwise leave if alone before encoding.
1297            (SessionSaver.write_layer): Add support for writing both Layers
1298            and RasterLayers.
1299    
1300            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1301            The right argument may not be a string, it could also be a Column.
1302    
1303            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1304            Make initial window size 600x400. Fixes RTBug #1872.
1305    
1306            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1307            the dialog is constructed so that we can support layers that
1308            do not have classifications.
1309            (Classifier._OnTry): Only build a classification if the layer
1310            supports one.
1311    
1312            * Thuban/UI/legend.py: Change all checks that a layer is an
1313            instance of Layer into checks against BaseLayer.
1314            (LegendTree.__FillTreeLayer): Only add children to a branch if
1315            the layer supports classification.
1316    
1317            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1318            MainWindow.OpenSession): Don't proceed with an action if the
1319            user chooses Cancel when they are asked to save changes.
1320            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1321            user to select an image file. Create a new RasterLayer and add
1322            it to the map.
1323    
1324            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1325            for rendering RasterLayer layers.
1326            (MapRenderer.draw_raster_layer): Actually method that calls
1327            the GDALWarp python wrapper and constructs an image from the
1328            data returned.
1329    
1330            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1331            Choices symbols to match those used in the table query method.
1332            Replace deprecated method calls on table with new method names.
1333    
1334            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1335            how small the scale can get. This still needs more testing.
1336    
1337            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1338            Provides a driver to output in .bmp format.
1339    
1340            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1341            New. Provides IO routines which write to memory, rather than a file.
1342    
1343            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1344            of the gdalwarp utility provided in GDAL. Added function calls
1345            that can be accessed from python.
1346    
1347            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1348            a raster layer.
1349    
1350            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1351            layer image data.
1352    
1353            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1354    
1355            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1356            tests associated with the raster layer code.
1357    
1358            * test/test_transientdb.py
1359            (TestTransientTable.test_auto_transient_table_query): Added a test
1360            for using a Column object as the "right" parameter to a query.
1361    
1362    2003-05-19  Frank Koormann  <[email protected]>
1363    
1364            * Thuban/version.py (get_changelog_date):
1365            Catch exceptions if ChangeLog does not exist.
1366    
1367            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1368    
1369    2003-05-19  Frank Koormann  <[email protected]>
1370    
1371            Extended version information for Thuban
1372    
1373            * Thuban/version.py: New, version information for Thuban: Last
1374            modification date and last ChangeLog entry date.
1375    
1376            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1377            information: Display Thuban, wxPython and Python version.
1378    
1379    2003-05-16  Bernhard Herzog  <[email protected]>
1380    
1381            * Thuban/Model/save.py: Remove some unused imports including the
1382            __future__ import for nested_scopes as Thuban relies on Python 2.2
1383            now.
1384            (XMLWriter.encode): Remove the special case for a None argument.
1385            In the saver encode is always called with a string argument.
1386    
1387    2003-05-16  Bernhard Herzog  <[email protected]>
1388    
1389            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1390            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1391            of the bug was that e.g. float("1.2") would fail. Thuban now
1392            requires 2.4.x.
1393            
1394    2003-05-16  Frank Koormann   <[email protected]>
1395    
1396            Printing enhancement and WMF export (under Win32)
1397    
1398            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1399            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1400            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1401            PrintRender.
1402    
1403            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1404            to fullfil information needed for PrinterRenderer.
1405            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1406            (MapCanvas.Print): Adapted to new MapPrintout.
1407            (OutputTransform): General calculations to transform from canvas
1408            coordinates to export/printing devices.
1409    
1410            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1411            new method_command to call ExportMap, with platform dependency (only
1412            __WXMSW__)
1413      
1414            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1415            of scalebar drawing area as new parameters.
1416            
1417            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1418    
1419            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1420            Update to extended scalebar.DrawScalebar header.
1421    
1422            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1423    
1424            * test/test_scalebar.py: Made test executable as standalone.
1425    
1426    2003-05-16  Bernhard Herzog  <[email protected]>
1427    
1428            * Thuban/Model/table.py (Table): Remove this compatibility alias
1429            for DBFTable.
1430    
1431            * test/test_table.py: Import DBFTable as Table because that alias
1432            doesn't exist anymore.
1433    
1434            * Thuban/UI/classgen.py: Remove some unused imports
1435    
1436    2003-05-14  Jonathan Coles   <[email protected]>
1437    
1438            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1439            Fix docstring.
1440            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1441            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1442            values of the supplied range to determine the beginning and end
1443            bounds of the generated classes.
1444    
1445            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1446            do not have a leading 0 (.5 is now accepted as well as 0.5).
1447    
1448            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1449            call to ClassGenerator.GenUniformDistribution.
1450    
1451            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1452            layout bug with the 'Projection' label.
1453    
1454            * test/support.py (FloatTestCase): New. Needed for the Range tests.
1455    
1456            * test/test_range.py: New. Imported from SciParam.
1457    
1458    2003-05-12  Jonathan Coles   <[email protected]>
1459    
1460            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1461            to table.UniqueValues() with calls that retrieve all the values
1462            from the table. This will need to be replaced by a method on table
1463            which can simply return the list (perhaps more efficiently).
1464    
1465    2003-05-12  Jonathan Coles   <[email protected]>
1466    
1467            The return value of ClassGenerator.CalculateQuantiles has changed.
1468            Refer to the documentation for details.
1469    
1470            * test/test_classgen.py: Modified Quantile tests to use the
1471            new return values.
1472    
1473            * Thuban/Model/classgen.py
1474            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1475            use new return values from CalculateQuantiles to produce the correct
1476            range bounds in the Classification.
1477            (ClassGenerator.CalculateQuantiles): Add more comments describing
1478            the return values and parameters. Make minor adjustments to improve
1479            the legibility of the code. Fix problem with adjusted not being set
1480            in most cases.
1481    
1482    2003-05-12  Frank Koormann <[email protected]>
1483            
1484            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1485            and latin1. Fixes #1851 finally.
1486    
1487    2003-05-09  Jonathan Coles   <[email protected]>
1488    
1489            * test/test_classgen.py: New. Tests the Quantile algorithm.
1490    
1491            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1492            Clean up debugging statement, add comments, fix a small bug in the
1493            returned adjusted percentiles.
1494            
1495    2003-05-09  Jonathan Coles   <[email protected]>
1496    
1497            Introduces Range class from SciParam into the ClassGroupRange class,
1498            and such ranges can now be saved and loaded from disk.
1499    
1500            Quantiles are now available in the Classification Generator.
1501    
1502            Initial support for building Queries on a table. Doesn't do anything
1503            but run some tests.
1504    
1505            * Thuban/Model/classification.py: Explicit imports.
1506            (ClassGroupRange): Use the Range class to store the underlying
1507            range information. The interface remains the same, except for
1508            GetRange(), and you can also supply a Range object as the min
1509            parameter to SetRange or __init__.
1510    
1511            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1512            string appropriately for use in Thuban. Fixes RTbug #1851.
1513            (SessionLoader.end_projection): Handle the context of the
1514            projection tag a bit better by looking at what objects are not
1515            None. There was an assumption that a projection tag for a map
1516            could occur before any layers.
1517            (SessionLoader.start_clrange): Provide backward compatibility for
1518            reading min/max values as well as the new range parameter.
1519    
1520            * Thuban/Model/map.py: Explicit imports.
1521    
1522            * Thuban/Model/resource.py: Import _.
1523            (ProjFileSaver.write): write header using projfile.dtd.
1524    
1525            * Thuban/Model/save.py: Explicit imports.
1526            (XMLWriter.encode): New. Encode the given string from a format
1527            used by Thuban into UTF-8. Fixes RTbug #1851.
1528    
1529            * Thuban/UI/classgen.py: Explicit imports.
1530            (ClassGenDialog.__init__): Clean up the code and add support
1531            for Quantiles.
1532            (ClassGenDialog.OnOK): Add support for Quantiles.
1533            (GenQuantilesPanel): New. Input panel for Quantiles.
1534            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1535            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1536    
1537            * Thuban/Model/classgen.py: New. Contains all the classes named above.
1538    
1539            * Thuban/UI/classifier.py: Explicit imports.
1540            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1541            ClassTable.SetValueAsCustom): Reworked to use new Range class.
1542    
1543            * Thuban/UI/legend.py: Explicit imports.
1544    
1545            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1546            a Table menu and associated method calls.
1547            (MainWindow.choose_color): Removed. No longer needed.
1548    
1549            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1550            should be disabled if no projection is selected in the available
1551            list.
1552    
1553            * Thuban/UI/renderer.py: Explicit imports.
1554    
1555            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1556            with correctly selecting the rows and issuing the right events.
1557            Be sure to call Skip() to allow the grid to do some of its own
1558            handling which allows the rows to actually be selected.
1559            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1560            selecting multiple shapes.
1561            (LayerTableFrame): Support for building Queries.
1562            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1563    
1564            * Thuban/UI/tree.py: Explicit imports.
1565    
1566            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1567            table view can call it.
1568    
1569            * test/test_classification.py: Explicit imports.
1570            (TestClassification.test_ClassGroupRange): Fix test for new
1571            Range class.
1572    
1573            * Doc/thuban.dtd: Add range parameter for clrange.
1574    
1575            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1576            object in ClassGroupRange, and also uesd for inputting ranges in
1577            the classifer table and elsewhere.
1578    
1579            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1580            yet.
1581    
1582    2003-05-09  Frank Koormann <[email protected]>
1583    
1584            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1585    
1586    2003-05-08  Frank Koormann <[email protected]>
1587    
1588            Coding style updates
1589    
1590            * test/test_scalebar.py: Replaced tab indentation by spaces.
1591    
1592            * Thuban/UI/scalebar.py: Explicit imports.
1593    
1594    2003-05-08  Frank Koormann <[email protected]>
1595    
1596            * Thuban/UI/scalebar.py
1597            (ScaleBar.DrawScalebar): Format string bug fixed.
1598    
1599    2003-05-08  Frank Koormann <[email protected]>
1600    
1601            Reorganization of scalebar component (no wx in Thuban/Model)
1602    
1603            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1604            (deriveInterval):
1605            Calculate scalebar interval and unit which fits in width for scale.
1606            (roundInterval): Round float.
1607    
1608            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1609    
1610            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1611    
1612            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1613    
1614    2003-05-08  Frank Koormann <[email protected]>
1615    
1616            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1617            Initialize ScaleBar with canvas.map
1618    
1619            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1620            round intervals to display smarter lengths
1621            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1622            layer. If the maps has no projection applied grey the scalebar.
1623    
1624    2003-05-07  Frank Koormann <[email protected]>
1625            
1626            Basic Scalebar features added.
1627    
1628            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1629    
1630            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1631            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1632            and the renderer.
1633    
1634            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1635    
1636            * Thuban/UI/messages.py: SCALE_CHANGED added.
1637    
1638    2003-05-07  Bernhard Herzog  <[email protected]>
1639    
1640            * Thuban/Model/session.py (Session.__init__): New instance
1641            variable shapestores to hold a list of all open shapestore objects
1642            (Session.ShapeStores): New. Accessor method for the shapestores
1643            list.
1644            (Session._add_shapestore, Session._clean_weak_store_refs): New.
1645            Internal methods to maintain the shapestores list.
1646            (Session.Tables): New. Return all tables open in the session.
1647            (Session.OpenShapefile): Insert the new ShapeStore into the
1648            shapestores list.
1649    
1650            * test/test_session.py (TestSessionSimple.test_initial_state): Add
1651            tests for ShapeStores and Tables
1652            (TestSessionWithContent.test_shape_stores)
1653            (TestSessionWithContent.test_tables): New. Test cases for
1654            ShapeStores and Tables
1655    
1656    2003-05-07  Bernhard Herzog  <[email protected]>
1657    
1658            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1659            Add comments about the optimizations used.
1660            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1661            Implement the ReadValue table interface method.
1662    
1663            * test/test_transientdb.py
1664            (TestTransientTable.run_iceland_political_tests)
1665            (TestTransientTable.test_transient_joined_table): Add tests for
1666            ReadValue
1667    
1668    2003-05-07  Frank Koormann <[email protected]>
1669    
1670            * Resources/Bitmaps/fulllayerextent.xpm,
1671            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1672            new icons.
1673    
1674    2003-05-06  Bernhard Herzog  <[email protected]>
1675    
1676            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1677            New. Simply delegate to the transient table's version.
1678    
1679            * test/test_transientdb.py
1680            (TestTransientTable.test_auto_transient_table_query): New. Test
1681            case for AutoTransientTable's SimpleQuery
1682    
1683    2003-05-06  Bernhard Herzog  <[email protected]>
1684    
1685            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1686            Implement a simple query method for the query dialog
1687            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1688            the row index or shapeid.
1689            (TransientTable.create): Insert the right value of the row index
1690            (TransientJoinedTable.create): Copy the row index of the left
1691            table to the joined result table
1692    
1693            * test/test_transientdb.py
1694            (TestTransientTable.test_transient_table_read_twice): Fix
1695            doc-string
1696            (TestTransientTable.test_transient_table_query): New. Test for the
1697            SimpleQuery method
1698    
1699    2003-05-06  Bernhard Herzog  <[email protected]>
1700    
1701            Convert all table users to use the new table interface. This only
1702            covers Thuban itself, not GREAT-ER or other applications built on
1703            Thuban yet, so the compatibility interface stays in place for the
1704            time being but it now issues DeprecationWarnings.
1705    
1706            Finally, the new Table interface has a new method, HasColumn.
1707    
1708            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1709            issue deprecation warnings when they're. The warnings refer to the
1710            caller of the method.
1711            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1712            for the deprecation warnings
1713    
1714            * test/test_table.py: Ignore the deprecation warnings for the old
1715            table in the tests in this module. The purpose of the tests is to
1716            test the old interface, after all.
1717    
1718            * test/test_transientdb.py
1719            (TestTransientTable.run_iceland_political_tests): Use the
1720            constants for the types. Add a test for HasColumn
1721            (TestTransientTable.test_transient_joined_table): Adapt to new
1722            table interface. Add a test for HasColumn
1723            (TestTransientTable.test_transient_table_read_twice): Adapt to new
1724            table interface
1725    
1726            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
1727            Adapt to new table interface
1728    
1729            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
1730            new table interface
1731    
1732            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
1733            (RecordTable.SetTable): Adapt to new table interface
1734    
1735            * Thuban/UI/classifier.py (Classifier.__init__)
1736            (Classifier.__init__): Adapt to new table interface
1737    
1738            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1739            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
1740            to new table interface
1741    
1742            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
1743            (AutoTransientTable.HasColumn): Implement the new table interface
1744            method
1745            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
1746            (AutoTransientTable.UniqueValues): Adapt to new table interface
1747    
1748            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
1749            Adapt to new table interface
1750    
1751            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
1752            simplify opening shapefiles a bit easier.
1753            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1754            (TestLayer.test_point_layer): Use the new helper method
1755            (TestLayer.test_get_field_type): New. Test for the GetFieldType
1756            method
1757    
1758            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
1759            the new table method
1760    
1761            * test/test_memory_table.py (TestMemoryTable.test_has_column):
1762            Test for the new table method HasColumn
1763    
1764    2003-05-06  Jonathan Coles   <[email protected]>
1765    
1766            Addresses the "Selection Extent" wish of RTbug #1787.
1767    
1768            * Resources/Bitmaps/fulllayerextent.xpm,
1769            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
1770            extent. These are just place holders for the real bitmaps.
1771    
1772            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
1773            calculate the bounding box once (the first time compute_bbox() is
1774            called).
1775            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
1776            the bounding box for the shapes in lat/long coordinates.
1777    
1778            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1779            option.
1780            (MainWindow.has_selected_shapes): New. Returns true if there are
1781            any selected shapes.
1782            (MainWindow.FullSelectionExtent): New. Calls
1783            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1784            (_has_selected_shapes): New. Returns true if there are any
1785            selected shapes.
1786    
1787            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1788            true if there are any selected shapes.
1789    
1790            * Thuban/UI/view.py (MapCanvas): Added delegated method
1791            HasSelectedShapes.
1792            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1793            shapes on the canvas using the map projection (if any).
1794    
1795            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1796            for Layer.ShapesBoundingBox().
1797    
1798    2003-05-06  Bernhard Herzog  <[email protected]>
1799    
1800            * Resources/Projections/defaults.proj: Fix spelling of Mercator
1801    
1802    2003-05-05  Jonathan Coles   <[email protected]>
1803    
1804            Addresses the "Full Layer Extent" wish of RTbug #1787.
1805    
1806            * Resources/Projections/defaults.proj: Added UK National Grid.
1807    
1808            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1809            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1810            when the user selects the menu option.
1811    
1812            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1813            scales the given layer on the canvas using the map projection.
1814    
1815    2003-05-05  Bernhard Herzog  <[email protected]>
1816    
1817            Convert the table implementations to a new table interface. All
1818            tables use a common mixin class to provide backwards compatibility
1819            until all table users have been updated.
1820    
1821            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1822            provide backwards compatibility for table classes implementing the
1823            new interface
1824            (DBFTable, MemoryTable): Implement the new table interface. Use
1825            OldTableInterfaceMixin as base for compatibility
1826            (DBFColumn, MemoryColumn): New. Column description for DBFTable
1827            and MemoryTable resp.
1828    
1829            * test/test_dbf_table.py: New. Test cases for the DBFTable with
1830            the new table interface.
1831    
1832            * test/test_memory_table.py: New. Test cases for the MemoryTable
1833            with the new table interface.
1834    
1835            * test/test_table.py: Document the all tests in this file as only
1836            for backwards compatibility. The equivalent tests for the new
1837            interface are in test_memory_table.py and test_dbf_table.py
1838            (MemoryTableTest.test_read): field_info should be returning tuples
1839            with four items
1840            (MemoryTableTest.test_write): Make doc-string a more precise.
1841    
1842            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1843            table interface. Derive from from OldTableInterfaceMixin for
1844            compatibility.
1845            (TransientTableBase.create): New intance variable column_map to
1846            map from names and indices to column objects
1847            (TransientTable.create): Use the new table interface of the input
1848            table
1849            (AutoTransientTable): Convert to new table interface. Derive from
1850            from OldTableInterfaceMixin for compatibility.
1851            (AutoTransientTable.write_record): Removed. It's not implemented
1852            yet and we still have to decide how to handle writing with the new
1853            table and data framework.
1854    
1855            * test/test_transientdb.py
1856            (TestTransientTable.run_iceland_political_tests)
1857            (TestTransientTable.test_transient_joined_table): Use the new
1858            table interface
1859    
1860    2003-05-05  Jonathan Coles   <[email protected]>
1861    
1862            This is namely a collection of UI updates to improve user interactivity.
1863            Tabbing between controls now exists and you can use ESC to close dialog
1864            boxes; ENTER will active the default button.
1865    
1866            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1867            order that the controls are created so that tabbing works correctly.
1868            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1869            wxDialog can handle the default button correctly.
1870            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1871            same reasons as for OnOK.
1872            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1873            when we ask the table for the maximum/minimum values of a field
1874            which could take a very long time.
1875    
1876            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1877            order that the controls are created so that tabbing works correctly.
1878            (SelectPropertiesDialog.__init__): Rearrange the order that the
1879            controls are created so that tabbing works correctly.
1880    
1881            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1882            to derive from a wxDialog but behave like the original implementation
1883            which was derived from a wxFrame. wxDialog provides useful key
1884            handling functionality like ESC calling OnCancel and ENTER calling
1885            OnOK which is lost with wxFrame.
1886    
1887            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1888            new dialogs.
1889    
1890            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1891            order that the controls are created so that tabbing works correctly.
1892            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1893            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1894            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1895            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1896            can provide the "UK National Grid" as a default projection.
1897            (UTMPanel.__init__): Rearrange the order that the controls are
1898            created so that tabbing works correctly.
1899    
1900    2003-05-05  Bernhard Herzog  <[email protected]>
1901    
1902            * extensions/thuban/wxproj.cpp: Fix some of the comments.
1903            (project_point): If a map projection but no layer projection is
1904            given, convert degrees to radians before applying the map
1905            projection.
1906    
1907            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1908            (TableGrid.allow_messages): New methods to make it possible to
1909            inhibit message sending.
1910            (TableGrid.issue): Only send the message if not inhibited.
1911            (LayerTableGrid.select_shape): Use the new methods to make sure
1912            that no ROW_SELECTED message is sent while we're updating the
1913            selected rows to match the selected shapes.
1914    
1915    2003-05-02  Jan-Oliver Wagner <[email protected]>
1916    
1917            Implementation of MemoryTable.
1918    
1919            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1920            implementation that operates on a list of tuples. All of the data
1921            are kept in the memory.
1922    
1923            * test/test_table.py (MemoryTableTest): New.
1924    
1925            * test/test_transientdb.py (SimpleTable): Removed.
1926            (TestTransientTable.test_transient_joined_table,
1927            (TestTransientTable.test_transient_table_read_twice): Replaced
1928            SimpleTable by MemoryTable.
1929    
1930    2003-04-30  Jonathan Coles   <[email protected]>
1931    
1932            * Data/iceland_sample.thuban: Now contains correct projections
1933            for each of the layers.
1934    
1935            * Resources/Projections/defaults.proj: Geographic projection
1936            contains unit conversion parameter.
1937    
1938    2003-04-30  Jonathan Coles   <[email protected]>
1939    
1940            The most important part of this putback is the projection changes.
1941            It should now be possible to specify the projection that a layer
1942            is in and then specify a different projection for the map. The
1943            projection dialog has an extra parameter for a geographic projection
1944            which lets the user select if the input is in degrees or radians.
1945    
1946            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1947            to say that the parameter is a tuple of unprojected
1948            points (which is what the callers to this method were assuming).
1949            Also, since the points are unprojected we need to projected them.
1950    
1951            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1952            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1953            groups are selected, move the layer up/down. Fixes RTbug #1833.
1954    
1955            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1956    
1957            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1958            parameter in call to SetClientData.
1959            (GeoPanel): Add support for selecting the units that the
1960            source data is in (Radians or Degrees).
1961    
1962            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1963            the rendering loop by reducing the number of if's, removing the
1964            unnecessary try/except block, and checking if the old group
1965            is the same as the new one (which happens a lot if there is
1966            no classification, or lots of shapes are in the same group).
1967    
1968            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1969            around the redraw routine to try to catch problems that the user
1970            may create by selecting invalid projections for the data set and
1971            map. Clears the display if there are any problems and prints the
1972            error.
1973            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1974            rectangle.
1975    
1976            * extensions/thuban/wxproj.cpp (project_point): First invert the
1977            supplied point (which should be in projected coordinates) using
1978            the layer's projection and then project the point using the
1979            map's projection.
1980            (project_points): Use project_point() to project each point.
1981    
1982    2003-04-30  Jan-Oliver Wagner <[email protected]>
1983    
1984            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1985            don't set the Classification to None if the classfication field
1986            is None (ie only a DEFAULT).
1987    
1988    2003-04-30  Bernhard Herzog  <[email protected]>
1989    
1990            * Thuban/UI/view.py: Fix some typos.
1991    
1992            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1993            not pop up the dialog if the selection becomes empty (this could
1994            happen if e.g. a new selection is opened while the identify tool
1995            is active and dialog had been closed)
1996    
1997    2003-04-30  Bernhard Herzog  <[email protected]>
1998    
1999            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
2000            instance variable read_record_last_result
2001            (TransientTableBase.read_record): Make sure reading the same
2002            record twice works. The implementation uses the new instance
2003            variable read_record_last_result
2004    
2005            * test/test_transientdb.py
2006            (TestTransientTable.test_transient_table_read_twice): New test
2007            case for the above bug-fix.
2008    
2009    2003-04-29  Jonathan Coles   <[email protected]>
2010    
2011            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
2012    
2013            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
2014    
2015            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
2016            (ClassTable.SetValueAsCustom): Rename keyword argument in
2017            ClassGroup* constructors to match argument name.
2018    
2019    2003-04-29  Bernhard Herzog  <[email protected]>
2020    
2021            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
2022            transient DB if it exists to make sure it doesn't leave a journal
2023            file in the temp directory.
2024    
2025            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
2026            self.conn to None after closing the connection to make sure it's
2027            not closed twice
2028    
2029    2003-04-29  Jonathan Coles   <[email protected]>
2030    
2031            Add a visible parameter in the layer XML tag. The default value is
2032            "true". If anything other than "false" is specified we also assume
2033            "true". Addresses RTbug #1025.
2034    
2035            * Doc/thuban.dtd: Add visible parameter to a layer.
2036    
2037            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
2038            of visible from 1 to True.
2039            (Layer.__init__): Change default value of visible from 1 to True.
2040    
2041            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
2042            parameter.
2043    
2044            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
2045            parameter.
2046    
2047            * test/test_load.py: Add new test data contents_test_visible.
2048            (LoadSessionTest.setUp): save test data.
2049            (LoadSessionTest.testLayerVisibility): Test if the visible flag
2050            is loaded correctly.
2051    
2052            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
2053            for saving an invisible layer.
2054    
2055    2003-04-29  Jonathan Coles   <[email protected]>
2056    
2057            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
2058            legend dialog box and tell it to change its map to the one
2059            supplied to SetMap(). Fixes RTbug #1770.
2060    
2061    2003-04-29  Bernhard Herzog  <[email protected]>
2062    
2063            Next step of table implementation. Introduce a transient database
2064            using SQLite that some of the data is copied to on demand. This
2065            allows us to do joins and other operations that require an index
2066            for good performance with reasonable efficiency. Thuban now needs
2067            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
2068            haven't tested that.
2069            
2070            * Thuban/Model/transientdb.py: New. Transient database
2071            implementation.
2072    
2073            * test/test_transientdb.py: New. Tests for the transient DB
2074            classes.
2075    
2076            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
2077            classes to help automatically remove temporary files and
2078            directories.
2079            (Session.__init__): New instance variables temp_dir for the
2080            temporary directory and transient_db for the SQLite database
2081            (Session.temp_directory): New. Create a temporary directory if not
2082            yet done and return its name. Use AutoRemoveDir to have it
2083            automatically deleted
2084            (Session.TransientDB): Instantiate the transient database if not
2085            done yet and return it.
2086    
2087            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
2088            AutoTransientTable so that data is copied to the transient DB on
2089            demand.
2090            (SimpleStore): New class that simply combines a table and a
2091            shapefile
2092    
2093            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
2094            DBFTable and update its doc-string to reflect the fact that this
2095            is only the table interface to a DBF file. Table is now an alias
2096            for DBFTable for temporary backwards compatibility.
2097    
2098            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
2099            the last reference to the session goes away so that the temporary
2100            files are removed properly.
2101    
2102            * test/test_load.py (LoadSessionTest.tearDown): Remove the
2103            reference to the session to make sure the temporary files are
2104            removed.
2105    
2106    2003-04-29  Bernhard Herzog  <[email protected]>
2107    
2108            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
2109            the __parser instance variable into a normal local variable in
2110            read. It's only used there and read will never be called more than
2111            once. Plus it introduces a reference cycle that keeps can keep the
2112            session object alive for a long time.
2113    
2114    2003-04-29  Jonathan Coles   <[email protected]>
2115    
2116            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
2117            Projection an immutable item. Fixes RTbug #1825.
2118            (Projection.__init__): Initialize instance variables here.
2119            (ProjFile.Replace): New. Replace the given projection object with
2120            the new projection object. This solves the problem of needing the
2121            mutator Projection.SetProjection() in the ProjFrame class and
2122            allows a projection to change parameters without changing its
2123            location in the file.
2124    
2125            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
2126            be of type wxSAVE and should verify overwriting a file.
2127    
2128            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
2129            ProjFile.Replace() method instead of the mutator
2130            Projection.SetProjection(). Also requires that we reassign the
2131            client data to the new projection.
2132    
2133            * test/test_proj.py (TestProjection.test): Test GetName() and
2134            GetAllParameters()
2135            (TestProjFile.test): Remove tests for Set*() methods. Add tests
2136            for Replace().
2137    
2138    2003-04-25  Jonathan Coles   <[email protected]>
2139    
2140            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
2141            to save the name of the projection.
2142    
2143            * test/test_save.py (SaveSessionTest.testLayerProjection): New
2144            test to verify layer projections are saved correctly.
2145    
2146    2003-04-25  Jonathan Coles   <[email protected]>
2147    
2148            * Thuban/Model/proj.py (Projection.SetName): Set the name
2149            to "Unknown" if name is None.
2150            (Projection.SetAllParameters): New. Set the projection's
2151            parameter list to the one supplied.
2152            (Projection.SetProjection): New. Set the projection's
2153            properties to those of the supplied Projection.
2154    
2155            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
2156            the dialog title to include the map's title.
2157            (MainWindow.LayerProjection): Set the dialog title to include
2158            the layer's title.
2159    
2160            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
2161            error dialogs into a single method call.
2162            (ProjFrame.__VerifyButtons): Add more states to check.
2163            (ProjFrame.__GetProjection): Return the current state of an
2164            edited projection or None.
2165            (ProjFrame.__FillAvailList): Remove checks for states that
2166            shouldn't exist.
2167            (ProjFrame._OnNew): Clear all selected items and supply
2168            a projection panel if necessary.
2169    
2170            * test/test_proj.py (TestProjFile.test): Add tests for
2171            ProjFile.SetAllParameters, ProjFile.SetProjection,
2172            ProjFile.SetName.
2173    
2174    2003-04-25  Jonathan Coles   <[email protected]>
2175    
2176            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
2177            takes an optional argument to select the current projection.
2178            This does not guarantee that the item is visible due to
2179            limited wxWindows functionality. Fixes RTBug #1821.
2180    
2181    2003-04-25  Jonathan Coles   <[email protected]>
2182    
2183            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
2184            the projection name and use it when constructing the Projection
2185            object.
2186    
2187            * Thuban/Model/proj.py (Projection.__init__): Change the default
2188            value for 'name' to None and then test if name is equal to None
2189            in the body of the constructor. This way the caller doesn't have to
2190            know what the default value should be. Namely, useful in load.py
2191            where we have to pick a default value if the 'name' parameter
2192            doesn't exist in the XML file.
2193    
2194            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
2195            Tests a file where a layer has a projection.
2196    
2197    2003-04-25  Jonathan Coles   <[email protected]>
2198    
2199            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
2200            tree for projection information.
2201    
2202            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
2203            XMLReader.GetFileName.
2204            (SessionLoader): Added support for loading projection tags that
2205            appear inside a layer.
2206    
2207            * Thuban/Model/proj.py (ProjFile): Document the class. Move
2208            back to using a list because the order of the projections in
2209            the file is important to maintain. Fixes RTbug #1817.
2210    
2211            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
2212            to ProjFile.GetFilename.
2213    
2214            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
2215            information.
2216    
2217            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
2218            ProjFrame._OnSaveAs. Removed old dead code from previous
2219            implementation.
2220            (ProjFrame._OnExport): Add support for exporting more than one
2221            projection to a single file.
2222            (ProjFrame.__FillAvailList): use string formatting (% operator)
2223            to build strings that are (partly) translated. Fixes RTbug #1818.
2224    
2225            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
2226            class.
2227    
2228    2003-04-24  Bernhard Herzog  <[email protected]>
2229    
2230            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
2231    
2232            * po/fr.po: New. French translation by Daniel Calvelo Aros
2233    
2234            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2235            empty strings.
2236    
2237    2003-04-24  Jonathan Coles   <[email protected]>
2238    
2239            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2240            implement the interface that the ProjFrame dialog expects.
2241    
2242            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2243            name of the projection to be changed.
2244            (ProjFile): Use a dictionary instead of a list so that removing
2245            projections is easier and we are sure about uniqueness.
2246            (ProjFile.Remove): Remove the given projection object.
2247    
2248            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2249            Return a list with only one projection file instead of searching for
2250            any projection file. This simplifies many things if the user can
2251            only have one system file and one user file.
2252    
2253            * Thuban/UI/classgen.py: Change all references to
2254            genCombo to genChoice.
2255    
2256            * Thuban/UI/mainwindow.py: Add a Projection option under the
2257            layer menu.
2258            (MainWindow.LayerProjection): New. Open up a projection window
2259            for a layer.
2260    
2261            * Thuban/UI/projdialog.py: Large changes to how the dialog is
2262            laid out. Use three panels instead of one. One for the list of
2263            projections, one for the edit controls, and one for the buttons.
2264            Fixed resizing problems so that the dialog resizes correctly
2265            when the projection panel changes. Added import/export, save, and
2266            new buttons/functionality.
2267    
2268    2003-04-24  Bernhard Herzog  <[email protected]>
2269    
2270            First step towards table management. Introduce a simple data
2271            abstraction so that we replace the data a layer uses more easily
2272            in the next step.
2273    
2274            * Thuban/Model/data.py: New file with a simple data abstraction
2275            that bundles shapefile and dbffile into one object.
2276    
2277            * Thuban/Model/session.py (Session.OpenShapefile): New method to
2278            open shapefiles and return a shape store object
2279    
2280            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2281            object instead of a shapefile filename. This introduces a new
2282            instance variable store holding the datastore. For intermediate
2283            backwards compatibility keep the old instance variables.
2284            (open_shapefile): Removed. No longer needed with the shape store.
2285            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2286            get the shape store used by a layer.
2287            (Layer.Destroy): No need to explicitly destroy the shapefile or
2288            table anymore.
2289    
2290            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2291            (MainWindow.AddLayer): Use the session's OpenShapefile method to
2292            open shapefiles
2293    
2294            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2295            session's OpenShapefile method to open shapefiles
2296    
2297            * test/test_classification.py
2298            (TestClassification.test_classification): Use the session's
2299            OpenShapefile method to open shapefiles and build the filename in
2300            a more platform independed way
2301    
2302            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2303            Implement to have a session to use in the tests
2304            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2305            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2306            session's OpenShapefile method to open shapefiles
2307            (TestLayerLegend.setUp): Instantiate a session so that we can use
2308            it to open shapefiles.
2309            (TestLayerLegend.tearDown): Make sure that all references to
2310            layers and session are removed otherwise we may get a resource
2311            leak
2312    
2313            * test/test_map.py (TestMapAddLayer.test_add_layer)
2314            (TestMapWithContents.setUp): Instantiate a session so that we can
2315            use it to open shapefiles.
2316            (TestMapWithContents.tearDown): Make sure that all references to
2317            layers, maps and sessions are removed otherwise we may get a
2318            resource leak
2319            ("__main__"): use support.run_tests() so that more info about
2320            uncollected garbage is printed
2321    
2322            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2323            session's OpenShapefile method to open shapefiles
2324            ("__main__"): use support.run_tests() so that more info about
2325            uncollected garbage is printed
2326    
2327            * test/test_selection.py (TestSelection.tearDown): Make sure that
2328            all references to the session and the selection are removed
2329            otherwise we may get a resource leak
2330            (TestSelection.get_layer): Instantiate a session so that we can
2331            use it to open shapefiles.
2332            ("__main__"): use support.run_tests() so that more info about
2333            uncollected garbage is printed
2334    
2335            * test/test_session.py (TestSessionBase.tearDown)
2336            (TestSessionWithContent.tearDown): Make sure that all references
2337            to the session and layers are removed otherwise we may get a
2338            resource leak
2339            (TestSessionWithContent.setUp): Use the session's OpenShapefile
2340            method to open shapefiles
2341    
2342    2003-04-24  Jonathan Coles   <[email protected]>
2343    
2344            * Thuban/Model/load.py (XMLReader.read): Should have been checking
2345            if the file_or_filename object had the 'read' attribute.
2346    
2347    2003-04-23  Jonathan Coles   <[email protected]>
2348    
2349            * Thuban/Model/resource.py: Fixes RTbug #1813.
2350            (ReadProjFile): Add documentation about which exceptions are raised.
2351            Always pass the exceptions up to the caller.
2352            (GetProjFiles): If the directory can't be read return an empty list.
2353            If any of the proj files can't be read skip that file and go
2354            on to the next one.
2355    
2356            * test/test_proj.py: Added test cases to handle nonexistent files,
2357            unreadable files, and files that don't parse correctly.
2358    
2359    2003-04-23  Jonathan Coles   <[email protected]>
2360    
2361            Projection dialog. Allows the user to select from a list
2362            of projection templates and optionally edit them and save new ones.
2363    
2364            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2365            (ProjPanel): Base class for projection specific panels.
2366            (TMPanel): Projection panel for Transverse Mercartor.
2367            (UTMPanel): Projection panel for Universal Transverse Mercartor.
2368            (LCCPanel): Projection panel for Lambert Conic Conformal.
2369            (GeoPanel): Projetion panel for Geographic Projection.
2370    
2371    2003-04-23  Jonathan Coles   <[email protected]>
2372    
2373            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2374            promote symmetry. There now exists XMLReader and XMLWriter.
2375            (XMLReader.read): New. Call to read the given file descriptor or
2376            filename.
2377            (XMLReader.close): New. Make sure the file is closed.
2378            (XMLReader.GetFileName): New. Return just the file name that is being
2379            read from.
2380            (XMLReader.GetDirectory): New. Return just the directory of the file
2381            that is being read.
2382            (XMLReader.AddDispatchers): New. Take a dictionary which contains
2383            the names of functions to call as the XML tree is parsed.
2384            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2385            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2386            (SessionLoader): Removed class variables start_dispatcher and
2387            end_dispatcher since this functionality is now part of a class
2388            instance. Fixes RTbug #1808.
2389            (SessionLoader.__init__): Add dispatcher functions.
2390            (load_xmlfile): Code was moved into the XMLReader.read().
2391            (load_session): Use modified SessionLoader.
2392    
2393            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2394            map's projection.
2395    
2396            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2397            GetAllParameters.
2398            (Projection.GetParameter): Returns the value for the given parameter.
2399    
2400            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2401            (GetProjFiles): Renamed from GetProjections. Now returns a list
2402            of ProjFile objects.
2403            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2404            a list of ProjFile objects whose files are not user defined.
2405            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2406            list of ProjFile objects whose files are user defined.
2407            (ProjFileReader): Extend new XMLReader.
2408    
2409            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2410            promote symmetry.
2411    
2412            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2413            control instead of a wxComboBox. wxChoice controls do not generate
2414            events as the uses highlights possible choices which fixes problems
2415            with resizing the dialog when the use selects an option.
2416    
2417            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2418            control instead of a wxComboBox.
2419    
2420            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2421            dialog.
2422    
2423            * test/test_proj.py (TestProjection.test): New tests for GetParameter
2424            method.
2425    
2426    2003-04-22  Bernhard Herzog  <[email protected]>
2427    
2428            * Thuban/UI/mainwindow.py: Remove some unused imports and global
2429            constants
2430    
2431            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2432            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2433    
2434    2003-04-17  Bernhard Herzog  <[email protected]>
2435    
2436            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2437            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2438            anymore.
2439            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2440            (Layer.ShapeType, Layer.Shape): No need to call
2441            self.open_shapefile since it's always called in __init__
2442    
2443            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2444            In wxPython 2.4 there's no need to extend MainLoop anymore since
2445            wxPython itself makes sure OnExit is called.
2446    
2447    2003-04-16  Jonathan Coles   <[email protected]>
2448    
2449            Initial putback of projection management code. Includes new
2450            classes to read and write projection files. The current load
2451            and save classes were abstracted a bit so they could be reused.
2452            The Projection class was extended to provide new methods and
2453            have a name.
2454    
2455            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2456            general XML reading methods that were part of ProcessSession.
2457    
2458            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
2459            name.
2460            (ProjFile): New. Represents a file that contains projection
2461            information.
2462    
2463            * Thuban/Model/resource.py: New. Contains general utilities
2464            for read and writing projection files.
2465    
2466            * Thuban/Model/save.py (XMLSaver): New. Contains all the
2467            general XML writing methods that were part of SessionSaver.
2468            (SessionSaver): Renamed from Saver.
2469    
2470            * test/test_proj.py: New test cases for the projection
2471            file read and write functions.
2472    
2473    2003-04-16  Jonathan Coles   <[email protected]>
2474    
2475            * Thuban/Model/classification.py: Use repr() around values
2476            in the ClassGroup*.__repr__() methods so it is clearer when
2477            a value is a string and when it is a number.
2478    
2479            * test/test_load.py: Rework the classification test to test
2480            that we can load old files.
2481            (testLabels): Test a file where the groups have labels.
2482    
2483    2003-04-16  Bernhard Herzog  <[email protected]>
2484    
2485            Safer implementation of the performance enhancements of the
2486            low-level renderer:
2487            
2488            * extensions/thuban/wxproj.cpp (extract_projection)
2489            (extract_pointer): Rename extract_projection to extract_pointer
2490            and redefine its purpose to return the pointer stored in a CObject
2491            returned by the object's cobject method. Update all callers.
2492            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
2493            handling of these low-level parameters so that each s_draw_info
2494            instance is handled as a CObject at python level that also
2495            contains real references to the actual python objects which
2496            contain the values in the struct. Add free_draw_info as the
2497            destructor.
2498            (draw_polygon_shape): Add the py_draw_info parameter which must a
2499            cobject containing an s_draw_info pointer.
2500    
2501            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
2502            method to instantiat the low-level render parameter
2503            (MapRenderer.draw_shape_layer): Use the new method. Remove some
2504            commented out code.
2505            (MapRenderer.draw_polygon_shape): Make the first parameter not the
2506            layer but the low-level render parameter
2507            (ScreenRenderer.draw_shape_layer): Use the low-level render
2508            parameter.
2509    
2510    2003-04-15  Jonathan Coles   <[email protected]>
2511    
2512            * Thuban/Model/classification.py: Implemented __repr__ for
2513            the ClassGroup* classes to make debugging a bit easier.
2514            (ClassGroup.SetLabel): Check that the string is an instance
2515            of StringTypes not StringType. Accounts for Unicode strings.
2516    
2517            * Thuban/Model/color.py: Implemented __repr__ to make
2518            debugging a bit easier.
2519    
2520            * Thuban/Model/save.py (Saver.write_classification): Need to
2521            save the group label.
2522    
2523            * test/test_load.py (testClassification): New. Loads the
2524            iceland_sample_test.thuban file and checks if it was loaded
2525            correctly.
2526    
2527    2003-04-15  Jonathan Coles   <[email protected]>
2528    
2529            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
2530            to improve rendering performance by initializing the variables
2531            that are not change each time draw_polygon_shape() is called.
2532            The values are stored in a global struct draw_info.
2533            (draw_polygon_shape): Removed initialization code that is
2534            now in draw_polygon_init().
2535    
2536            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
2537            drawing initialization call to draw_polygon_init()
2538            (MapRenderer.draw_polygon_shape): Use new signature of
2539            draw_polygon_shape.
2540    
2541            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
2542            weirdness by setting the range to (1, maxint).
2543    
2544            * Thuban/Model/classification.py (ClassGroupProperties): Make
2545            instance variables private and optimize comparison operator
2546            by first checking if the color references are the same.
2547            (ClassGroupSingleton): Make instance variables private.
2548            (ClassGroupRange): Make instance variables private.
2549    
2550            * HOWTO-Release: Filled in missing steps for releasing packages.
2551    
2552    2003-04-15  Bernhard Herzog  <[email protected]>
2553    
2554            First stab at internationalized messages:
2555    
2556            * Thuban/__init__.py (_): Implement the translation function for
2557            real using the python gettext module.
2558    
2559            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2560            translate empty strings.
2561    
2562            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2563            Add a missing space to a warning message
2564    
2565            * po/README: New. Notes about the management of the translation
2566            files.
2567    
2568            * po/Makefile: New. Makefile to help manage the translation files.
2569    
2570            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2571    
2572            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2573            translations and support files in po/
2574    
2575            * setup.py (data_files): Add the *.mo files to the data_files too
2576    
2577            * README: Add note about the translations when building from CVS
2578    
2579    2003-04-14  Jonathan Coles   <[email protected]>
2580    
2581            * Thuban/UI/dock.py: Fixes some window resizing problems most
2582            noticable under windows. Always assume the button bitmaps will
2583            be there. Code clean up.
2584            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2585            images for the dock/undock button to the same images.
2586            Work around for RTbug #1801.
2587    
2588            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2589            be allowed to grow within the sizer. Fixes a bug under Windows
2590            where the toolbar wasn't being drawn.
2591    
2592    2003-04-14  Frank Koormann   <[email protected]>
2593    
2594            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2595            Updated design to try to make the button functionality more
2596            transparent.
2597    
2598    2003-04-14  Jonathan Coles   <[email protected]>
2599    
2600            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
2601            finalize the intialization of the panel.
2602    
2603            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
2604            creation of the panel. Should be the last thing called in the
2605            initializer of a subclass.
2606    
2607            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
2608            set the current selections in the combo boxes. This is needed
2609            under Windows.
2610    
2611            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
2612            level panel to the dialog so that the background colors are
2613            consistent under Windows.
2614    
2615    2003-04-11  Jonathan Coles   <[email protected]>
2616    
2617            * Thuban/UI/classgen.py: Change color ramps to start at white
2618            not black.
2619    
2620            * Thuban/UI/legend.py: Enable/disable the legend buttons when
2621            the legend changes. Fixes RTbug #1793.
2622    
2623            * test/test_classification.py: Added test for copying of
2624            classifications.
2625    
2626    2003-04-11  Jonathan Coles   <[email protected]>
2627    
2628            * Thuban/UI/resource.py: New. Centralize the loading of resources
2629            such as bitmaps.
2630    
2631            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
2632            added images to the move buttons, added 'reverse' button.
2633            (CustomRampPanel.__init__): Added images to the move buttons.
2634            (GreyRamp): New. Generates a ramp from white to black.
2635            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
2636    
2637            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
2638            ID_PROPERTY_*.
2639            (Classifier.__init__): Minor changes to the layout.
2640            (Classifier._OnTitleChanged): Listen for when the user edits the
2641            title and update the dialog's title and the layer's title.
2642    
2643            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
2644    
2645            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
2646            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
2647            if the layer's title changes.
2648    
2649            * Thuban/UI/mainwindow.py: Added new menu item and associated code
2650            to open a dialog to rename the map.
2651            (MainWindow): Use new resource class to import bitmaps.
2652    
2653    2003-04-11  Jonathan Coles   <[email protected]>
2654    
2655            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2656            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
2657            Resources/Bitmaps/group_use_none.xpm,
2658            Resources/Bitmaps/group_use_not.xpm,
2659            Resources/Bitmaps/hide_layer.xpm,
2660            Resources/Bitmaps/layer_properties.xpm,
2661            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
2662            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
2663            New.
2664    
2665    2003-04-10  Jonathan Coles   <[email protected]>
2666    
2667            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
2668            Should pass group to ClassGroup constructor.
2669    
2670    2003-04-10  Jonathan Coles   <[email protected]>
2671    
2672            * Thuban/Model/classification.py: (ClassGroup): Move all the common
2673            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
2674            here. Implement SetVisible(), IsVisible().
2675            (ClassGroup.__init__): Add group parameter which acts as a copy
2676            constructor.
2677    
2678            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
2679            "Visible" check boxes.
2680            (Classifier): Rename the buttons and refactor the code to match
2681            the new labels.
2682    
2683            * Thuban/UI/legend.py: Classify button is now called "Properties".
2684            Refactored the code to change variable names.
2685            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
2686    
2687            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
2688            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
2689            renamed to MainWindow.LayerEditProperties.
2690            (MainWindow.ToggleLegend): Don't include map name in legend title.
2691            (MainWindow.SetMap): Added the map name to the window title.
2692            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
2693            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
2694            Functionality is found in the layer properties dialog.
2695    
2696            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
2697            draw visible groups.
2698    
2699    2003-04-09  Jonathan Coles   <[email protected]>
2700    
2701            * Thuban/UI/classgen.py: Modifications to allow simple
2702            addition and selection of new color schemes.
2703            (MonochromaticRamp): New. Generates a ramp between two colors.
2704            (RedRamp): New. Generates a ramp of all red.
2705            (GreenRamp): New. Generates a ramp of all green.
2706            (BlueRamp): New. Generates a ramp of all blue.
2707    
2708    2003-04-09  Jonathan Coles   <[email protected]>
2709    
2710            * Thuban/Model/classification.py (Classification.__deepcopy__):
2711            Need to copy over field and fieldType attributes.
2712    
2713            * Thuban/Model/table.py (Table.field_range): New. Retrive the
2714            maximum and minimum values over the entire table for a given
2715            field.
2716            (Table.GetUniqueValues): New. Retrieve all the unique values
2717            in the table for a given field.
2718    
2719            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
2720            (GenUniquePanel): New. Controls to allow the user to select
2721            which unique field values they would like in the classification.
2722            (CustomRampPanel): Code that was in ClassGenDialog that allows
2723            the user to select the properties for a custom ramp.
2724            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
2725    
2726            * Thuban/UI/classifier.py: Removed a lot of debugging code.
2727            (Classifier._SetClassification): Callback method so that the
2728            class generator can set the classification in the grid.
2729            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
2730            editing of a group properties class into a wxWindows control.
2731    
2732            * Thuban/UI/dock.py: It was decided that if the user closes
2733            a dockable window the window should simply hide itself. That
2734            way if the user wants to show the dock again it appears in the
2735            same place as it was when it was closed.
2736            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
2737            (DockableWindow._OnButtonClose): Hide the window instead of
2738            destroying it.
2739            (DockableWindow._OnClose): Hide the window instead of
2740            destroying it.
2741    
2742            * Thuban/UI/legend.py (LegendTree): Use a private method to
2743            consistently set the font and style of the text. Fixes RTbug #1786.
2744    
2745            * Thuban/UI/mainwindow.py: Import just the Classifier class.
2746    
2747    2003-04-07  Bernhard Herzog  <[email protected]>
2748    
2749            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
2750            to the map module
2751    
2752    2003-04-07  Bernhard Herzog  <[email protected]>
2753    
2754            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
2755            favor of ToggleSessionTree
2756            (MainWindow.ToggleSessionTree): New method to toggle visibility of
2757            the session tree.
2758            (MainWindow.SessionTreeShown): New method to return whether the
2759            session tree is currently shown.
2760            (MainWindow.ToggleLegend): New method to toggle visibility of the
2761            legend
2762            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
2763            LegendShown
2764            (MainWindow.LegendShown): New method to return whether the legend
2765            is currently shown.
2766            (_method_command): Add checked parameter so we can define check
2767            menu items
2768            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
2769            mainwindow methods.
2770            (show_session_tree, show_legend commands): Removed.
2771            (toggle_session_tree, toggle_legend commands): New commands to
2772            toggle the visibility of the dialogs
2773    
2774    2003-04-07  Jonathan Coles   <[email protected]>
2775    
2776            * Thuban/UI/classgen.py: Fix Windows problem.
2777    
2778            * Thuban/UI/dock.py: Fix Windows problem.
2779    
2780            * Thuban/UI/mainwindow.py: Use False instead of false.
2781            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
2782    
2783    2003-04-07  Jonathan Coles   <[email protected]>
2784    
2785            Since we now say that the order of the groups in a classification
2786            matters, it makes sense to be able to manipulate that order. Most
2787            of the changes to Thuban/Model/classification.py are to that end.
2788    
2789            * Thuban/Model/classification.py (Classification.AppendGroup,
2790            Classification.InsertGroup, Classification.ReplaceGroup,
2791            Classification.RemoveGroup, Classification.GetGroup): Do as the
2792            names imply.
2793            (Classification.FindGroup): This was called GetGroup, but GetGroup
2794            takes an index, while FindGroup takes a value.
2795            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
2796            REFERENCE. Currently there is a cyclic reference between the layer
2797            and its classification. If the classification doesn't need to know
2798            its owning layer we can change this, since it may make sense to be
2799            able to use the same classification with different layers.
2800    
2801            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
2802    
2803            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
2804            not AddGroup()
2805    
2806            * Thuban/UI/classifier.py: Now that we can depend on the order in
2807            a Classification and have methods to manipulate that order we don't
2808            need to use our own data structures in the grid. We can simply make
2809            the grid/table access the information they need from a copy of
2810            the classification object.
2811            (Classifier._OnCloseBtn): Event handler for when the user clicks
2812            'Close'. This is needed so if the user applies changes and then
2813            continues to change the table the user has the option of discarding
2814            the most recent changes and keeping what they applied.
2815    
2816            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
2817            into the same group.
2818    
2819            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
2820            with a really old version of proj, PJ_VERSION won't even be defined.
2821            If it isn't defined then just compile so that the function always
2822            returns Py_False.
2823    
2824            * test/test_classification.py: Fix tests to use the renamed methods.
2825            Still need to write tests for the new methods.
2826    
2827    2003-04-04  Jonathan Coles   <[email protected]>
2828    
2829            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
2830            call to SetSelection out of the method and before the call
2831            to __SelectField in __init__. This prevents a recursion of events
2832            when _OnFieldSelect is triggered by the user.
2833    
2834    2003-04-04  Jonathan Coles   <[email protected]>
2835    
2836            * Thuban/Model/classification.py: Rename Color.None to
2837            Color.Transparent.
2838            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
2839            Don't bother copying the color, since Colors are immutable.
2840    
2841            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
2842            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
2843            Thuban/UI/renderer.py, Thuban/UI/view.py:
2844            Rename Color.None to Color.Transparent.
2845        
2846            * test/test_classification.py, test/test_load.py: Rename Color.None
2847            to Color.Transparent.
2848    
2849    2003-04-04  Jonathan Coles   <[email protected]>
2850    
2851            * Thuban/Model/classification.py: Fix assert calls.
2852            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
2853            Copy the color parameter rather than hold onto a reference.
2854    
2855            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
2856            the color object.
2857            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
2858            are sure there exists only one refernce to Color.None in the system.
2859            This allows us to use 'is' rather than the comparision functions.
2860            
2861            * Thuban/Model/save.py: Fix assert calls.
2862            
2863            * Thuban/UI/classifier.py: Fix assert calls.
2864            (ClassGrid._OnCellDClick): Call up to the classifier to open the
2865            dialog to edit the groups properties.
2866            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
2867            correctly if a cell is resized.
2868            (ClassTable.SetClassification): New. Changes the classification
2869            that is in the table.
2870            (ClassTable.__SetRow): Allow groups to be prepended.
2871            (Classifier): New code for opening the EditProperties and
2872            GenerateRanges dialogs.
2873            (SelectPropertiesDialog.__GetColor): Only set the color in the
2874            color dialog if the current color is not None.
2875            
2876            * Thuban/UI/dock.py: Fix assert calls.
2877            
2878            * Thuban/UI/legend.py: Fix assert calls.
2879            
2880            * Thuban/UI/renderer.py: Fix assert calls.
2881            
2882            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
2883            classifications.
2884            (GenRangePanel): Panel specific to range generation.
2885            (GenSingletonPanel): Panel specific to singleton generation.
2886            (ClassGenerator): Class responsible for actually generating
2887            the classification from the data gathered in the dialog box.
2888            (PropertyRamp): Generates properties whose values range from
2889            a starting property to an ending property.
2890    
2891    2003-04-03  Bernhard Herzog  <[email protected]>
2892    
2893            * test/support.py (print_garbage_information): New function that
2894            prints information about still connected messages and memory
2895            leaks.
2896            (run_suite): Removed.
2897            (run_tests): New function for use as a replacement of
2898            unittest.main in the test_* files. This one calls
2899            print_garbage_information at the end.
2900    
2901            * test/runtests.py (main): Use support.print_garbage_information
2902    
2903            * test/test_layer.py: Use support.run_tests instead of
2904            unittest.main so we get memory leak information
2905            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2906            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2907            (TestLayerLegend.test_visibility): Call the layer's Destroy method
2908            to fix a memory leak.
2909    
2910            * test/test_classification.py: Use support.run_tests instead of
2911            unittest.main so we get memory leak information
2912            (TestClassification.test_classification): Call the layer's Destroy
2913            method to fix a memory leak.
2914    
2915    2003-04-02  Bernhard Herzog  <[email protected]>
2916    
2917            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2918            Handle the reference counts of the return value and errors in
2919            PyArg_ParseTuple correctly.
2920    
2921            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2922            sure the filename is absolute to avoid problems when saving the
2923            session again
2924    
2925            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2926    
2927    2003-04-01  Jonathan Coles   <[email protected]>
2928    
2929            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2930            that there actually are points in the returned list of points
2931            before trying to index into the list. The list may be empty if
2932            the shape is a Null Shape.
2933    
2934    2003-04-01  Bernhard Herzog  <[email protected]>
2935    
2936            * test/test_map.py: Don't use from <module> import *
2937    
2938    2003-04-01  Jonathan Coles   <[email protected]>
2939    
2940            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
2941            LAYER_LEGEND_CHANGED
2942    
2943            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
2944            self.Destroy() to close the window after yesterday's changes.
2945    
2946            * test/test_map.py, test/test_session.py: Fix messages that
2947            are sent from maps and layers.
2948    
2949    2003-03-31  Jonathan Coles   <[email protected]>
2950    
2951            * Thuban/UI/classifier.py: Commented out some debugging statements.
2952            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
2953            RTbug #1769.
2954    
2955            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
2956            position (although position doesn't work yet under GTK).
2957            (DockableWindow.Destroy): New. Called when the window must be
2958            closed. Namely needed when the DockFrame closes and must close
2959            its children.
2960            (DockFrame): Listen for EVT_CLOSE and destroy all children.
2961    
2962            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
2963            when then window is told to close.
2964            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
2965            comment in source for more info.
2966    
2967            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
2968    
2969            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
2970            symmetry with other such methods.
2971            (MainWindow.ShowLegend): Show the legend docked by default.
2972    
2973    2003-03-28  Jonathan Coles   <[email protected]>
2974    
2975            * Thuban/UI/classifier.py: Support for highlighting a specific
2976            group within the grid when the classification dialog is opened.
2977            Also contains a lot of debugging printouts which will later
2978            be removed.
2979    
2980            * Thuban/UI/dock.py: Complete rework on the dock code so that
2981            that it is fairly removed from the rest of the Thuban application.
2982            It is easy to add new docks which the rest of the program having
2983            to be aware of them.
2984    
2985            * Thuban/UI/legend.py: Modifications to support selecting a
2986            specific group in the classification dialog. Changed how layers
2987            are drawn when the layer is visible/invisible.
2988    
2989            * Thuban/UI/mainwindow.py: Removed legend specific code and
2990            replaced it with calls to the new dock code.
2991    
2992            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
2993            to check if scale > 0. Trying to track down a divide by zero.
2994    
2995    2003-03-26  Jonathan Coles   <[email protected]>
2996    
2997            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
2998            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
2999            now part of DockableWindow.
3000            (LegendPanel.DoOnSelChanged): Select the current layer in the
3001            map.
3002            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
3003            with the selected layer and/or group.
3004    
3005    2003-03-26  Jonathan Coles   <[email protected]>
3006    
3007            This putback contains the code for dockable windows. There is
3008            no support in wxWindows as of this date for windows that can
3009            attach themselves to other windows.
3010    
3011            The current model contains a DockableWindow which has a parent
3012            window for when it is detached and a dock window that it puts
3013            its contents in when it is docked. The contents of a DockableWindow
3014            must be a DockPanel. DockPanel itself derives from wxPanel.
3015    
3016            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
3017            message, not a LAYER_LEGEND_CHANGED message.
3018    
3019            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
3020    
3021            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
3022            as one of the style properties for the fieldTypeText item to
3023            be sure that its size is correct when the text changes.
3024    
3025            * Thuban/UI/dock.py: New. Classes for the DockPanel and
3026            DockableWindow.
3027    
3028            * Thuban/UI/legend.py: Added some more buttons and made the
3029            LegendPanel a DockPanel.
3030    
3031            * Thuban/UI/mainwindow.py: Added sash windows to the main window
3032            and supporting functions for manipulating the sashes.
3033            (MainWindow.ShowLegend): Create a DockableWindow with the
3034            LegendPanel as the contents.
3035    
3036            * Thuban/UI/messages.py: Added DOCKABLE_* messages
3037    
3038            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
3039            not LAYER_LEGEND_CHANGED, messages.
3040    
3041    2003-03-25  Jonathan Coles   <[email protected]>
3042    
3043            * setup.py: Added custom script bdist_rpm_build_script so that
3044            when the rpm is built the path to wx-config is correct.
3045    
3046            * setup.cfg: Added line saying to use the custom build script
3047    
3048    2003-03-20  Jonathan Coles   <[email protected]>
3049    
3050            Initial implementation of the Legend.
3051    
3052            * Thuban/UI/legend.py: New. Creates a window that shows the map's
3053            Legend information and allows the user to add/modify classifications
3054            and how the layers are drawn on the map.
3055    
3056            * setup.py: New command 'build_docs' which currently uses
3057            happydoc to generate html documentation for Thuban.
3058    
3059            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
3060            Returns a string which is appropriately describes the group.
3061    
3062            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
3063            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
3064    
3065            * Thuban/Model/map.py (Map): Rename messages and use new, more
3066            specific, messages.
3067    
3068            * Thuban/Model/messages.py: New message to indicate that a layer's
3069            data has changed (LAYER_CHANGED). New map messages to indicate
3070            when layers have been added/removed/changed or if the stacking order
3071            of the layers has changed.
3072    
3073            * Thuban/Model/session.py: Rename and use new messages.
3074    
3075            * Thuban/UI/classifier.py: Remember if any changes have actually
3076            been applied so that if the dialog is cancelled without an application
3077            of changes we don't have to set a new classification.
3078            (ClassDataPreviewer): Pulled out the window specific code and put it
3079            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
3080            symbols on any DC.
3081            
3082            * Thuban/UI/mainwindow.py: New code to open the legend.
3083    
3084            * Thuban/UI/view.py: Use new message names.
3085    
3086    2003-03-19  Jonathan Coles   <[email protected]>
3087    
3088            * Thuban/UI/main.py (verify_versions): New. Checks the versions
3089            of Python, wxPython, and some other libraries.
3090    
3091            * extensions/thuban/wxproj.cpp (check_version): Checks the given
3092            version against what wxproj was compiled with.
3093            (check_version_gtk): If wxproj was compiled with gtk then check
3094            the given version against the version of the gtk library
3095            currently being used.
3096    
3097    2003-03-14  Bernhard Herzog  <[email protected]>
3098    
3099            * test/test_command.py: Run the tests when the module is run as a
3100            script
3101    
3102    2003-03-14  Bernhard Herzog  <[email protected]>
3103    
3104            Implement selection of multiple selected shapes in the same layer:
3105    
3106            - Introduce a new class to hold the selection. This basically
3107              replaces the interactor which was nothing more than the
3108              selection anyway. A major difference is of course that the new
3109              selection class supports multiple selected shapes in one layer
3110            
3111            - Move the object that represents the selection from the
3112              application to the canvas. The canvas is a better place than the
3113              application because the selection represents which shapes and
3114              layer of the map displayed by the canvas are selected and
3115              affects how the map is drawn.
3116    
3117            - Make the selection and its messages publicly available through
3118              the mainwindow.
3119    
3120            - The non-modal dialogs do not get a reference to the interactor
3121              anymore as they can simply refer to their parent, the
3122              mainwindow, for the what the interactor had to offer.
3123    
3124            * Thuban/UI/selection.py: New module with a class to represent the
3125            selection.
3126    
3127            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
3128            these unused messages
3129    
3130            * Thuban/UI/application.py (ThubanApplication.OnInit)
3131            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
3132            interactor is gone now.
3133            (ThubanApplication.CreateMainWindow): There is no interactor
3134            anymore so we pass None as the interactor argument for now for
3135            compatibility.
3136    
3137            * Thuban/UI/view.py (MapCanvas.delegated_messages)
3138            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
3139            Unsubscribe, delegate messages according to the delegated_messages
3140            class variable.
3141            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
3142            attributes from instance variables as described with the
3143            delegated_methods class variable.
3144            (MapCanvas.__init__): New instance variable selection holding the
3145            current selection
3146            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
3147            pass them on to the renderer
3148            (MapCanvas.SetMap): Clear the selection when a different map is
3149            selected.
3150            (MapCanvas.shape_selected): Simple force a complete redraw. The
3151            selection class now takes care of only issueing SHAPES_SELECTED
3152            messages when the set of selected shapes actually does change.
3153            (MapCanvas.SelectShapeAt): The selection is now managed in
3154            self.selection
3155    
3156            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
3157            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
3158            Unsubscribe, delegate messages according to the delegated_messages
3159            class variable.
3160            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
3161            attributes from instance variables as described with the
3162            delegated_methods class variable.
3163            (MainWindow.__init__): The interactor as ivar is gone. The
3164            parameter is still there for compatibility. The selection messages
3165            now come from the canvas.
3166            (MainWindow.current_layer, MainWindow.has_selected_layer):
3167            Delegate to the the canvas.
3168            (MainWindow.LayerShowTable, MainWindow.Classify)
3169            (MainWindow.identify_view_on_demand): The dialogs don't need the
3170            interactor parameter anymore.
3171    
3172            * Thuban/UI/tableview.py (TableFrame.__init__)
3173            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
3174            (LayerTableFrame.row_selected): The interactor is gone. It's job
3175            from the dialog's point of view is now done by the mainwindow,
3176            i.e. the parent. Subscribe to SHAPES_SELECTED instead
3177            of SELECTED_SHAPE
3178            
3179            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
3180            is gone. It's job from the dialog's point of view is now done by
3181            the mainwindow, i.e. the parent.
3182            
3183            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
3184            gone. It's job from the dialog's point of view is now done by the
3185            mainwindow, i.e. the parent.
3186    
3187            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
3188            gone. It's job from the dialog's point of view is now done by the
3189            mainwindow, i.e. the parent.
3190            (SessionTreeCtrl.__init__): New parameter mainwindow which is
3191            stored as self.mainwindow. The mainwindow is need so that the tree
3192            can still subscribe to the selection messages.
3193            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
3194            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
3195            selection is now accessible through the mainwindow. Subscribe to
3196            SHAPES_SELECTED instead of SELECTED_SHAPE
3197    
3198            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
3199            SHAPES_SELECTED message now.
3200            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
3201            so deal with multiple shapes
3202            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
3203            gone. It's job from the dialog's point of view is now done by the
3204            mainwindow, i.e. the parent.
3205    
3206            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
3207            parameter is now a list of shape ids.
3208            (RecordTable.SetTable): The second parameter is now a list of
3209            indices.
3210    
3211            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
3212            selected_shape parameter and ivar to selected_shapes. It's now a
3213            list of shape ids.
3214            (MapRenderer.draw_label_layer): Deal with multiple selected
3215            shapes. Rearrange the code a bit so that the setup and shape type
3216            distinctions are only executed once.
3217    
3218            * test/test_selection.py: Test cases for the selection class
3219    
3220    2003-03-11  Jonathan Coles   <[email protected]>
3221    
3222            * Thuban/Model/load.py: Temporary fix so that the xml reader
3223            doesn't cause Thuban to crash.
3224    
3225            * Thuban/Model/layer.py: Handle the cyclic references between
3226            a layer and its classification better, and be sure to disconnect
3227            the classification from the layer when the layer is destroyed
3228            so that we don't maintain a cyclic reference that may not be
3229            garbage collected.
3230    
3231            * Thuban/Model/classification.py: See comment for layer.py.
3232    
3233    2003-03-12  Jan-Oliver Wagner <[email protected]>
3234    
3235            * HOWTO-Release: New. Information on the steps for releasing
3236            a new version of Thuban.
3237    
3238    2003-03-11  Jonathan Coles   <[email protected]>
3239    
3240            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
3241            Use True instead of true.
3242            (Classifier): Should have a single panel in which all the controls lie.
3243    
3244            * Thuban/UI/proj4dialog.py: Add normal border.
3245    
3246            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
3247    
3248            * Thuban/UI/mainwindow.py: Use True instead of true.
3249    
3250            * setup.py: Update some definitions to use wxWindows2.4 files
3251    
3252            * Data/iceland_sample_class.thuban: Fixed file so that the
3253            field_type information is present.
3254    
3255    2003-03-10  Jonathan Coles   <[email protected]>
3256    
3257            * Thuban/UI/classifier.py (Classifier.__init__): Make the
3258            field type label grow so that when the text changes the
3259            size is updated correctly. This may be a wxWindows bug.
3260    
3261    2003-03-10  Jonathan Coles   <[email protected]>
3262    
3263            * Thuban/UI/application.py: Changed SESSION_CHANGED to
3264            SESSION_REPLACED.
3265    
3266            * Thuban/UI/classifier.py: Wrap text with _().
3267            (ClassGrid.CreateTable): Set dimensions and size hints here,
3268            instead of in Reset, so we only set the size once.
3269    
3270            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
3271    
3272            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3273            Call Close() instead of Shutdown().
3274    
3275            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3276    
3277            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3278            Go back to using OnClose() instead of Shutdown().
3279    
3280    2003-03-10  Jonathan Coles   <[email protected]>
3281    
3282            * Thuban/UI/classifier.py (Classifier): SelectField() needed
3283            to know the old field index as well as the new one.
3284    
3285    2003-03-10  Jonathan Coles   <[email protected]>
3286    
3287            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
3288            to correctly set the table information and call this from
3289            __init__ and from _OnFieldSelect so that all the information
3290            is up to date when the dialog opens and when a field is changed.
3291    
3292    2003-03-10  Jonathan Coles   <[email protected]>
3293    
3294            * Thuban/Model/classification.py (Classification): Don't use
3295            layer's message function directly, use the ClassChanged() method
3296            when then classification changes. SetField/SetFieldType/SetLayer
3297            must keep the information about field name and field type in
3298            sync when an owning layer is set or removed.
3299    
3300            * Thuban/Model/layer.py: Added ClassChanged() so that the
3301            classification can tell the layer when its data has changed.
3302            (Layer.SetClassification): Accepts None as an arguement to
3303            remove the current classification and correctly handles
3304            adding a new classification.
3305    
3306            * Thuban/Model/load.py: Comment out print statement
3307    
3308            * test/test_classification.py, test/test_save.py: New and
3309            improved tests.
3310    
3311    2003-03-07  Jonathan Coles   <[email protected]>
3312    
3313            * Thuban/Model/classification.py: Implemented __copy__ and
3314            __deepcopy__ for ClassGroup* and ClassGroupProperites so
3315            they can easily be copied by the classifier dialog.
3316            (ClassGroupProperites.__init__): The default line color should
3317            have been Color.Black.
3318    
3319            * Thuban/UI/classifier.py: Setting and Getting table values now
3320            uses a consistent set of functions.
3321            (Classifier): Now non-modal. Has field type label which changes
3322            as the field changes. Keep track of buttons in a list so that
3323            we can enable/disable the buttons when the None field is selected.
3324            (SelectPropertiesDialog): Add buttons to make the colors transparent.
3325    
3326            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
3327            does what OnClose did, but can be called by the application to
3328            close a window. Needed when a session changes, and we have to
3329            close the classifier windows.
3330    
3331            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3332            Shuts down open dialogs. Used when a new session is created
3333            or a session is opened.
3334            (MainWindow.SaveSession): Should only call application.SaveSession()
3335            if we don't call SaveSessionAs first.
3336            (MainWindow.Classify): Allow different classifier dialogs for
3337            different layers.
3338    
3339            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
3340            the parent class handle it. Add Shutdown() to unsubscibe from
3341            event notification and call the parent Shutdown(). This was
3342            necessary so the application can close the tree window.
3343    
3344    2003-03-06  Jonathan Coles   <[email protected]>
3345    
3346            * Thuban/Model/classification.py: Minor documentation changes,
3347            Addition of __eq__ and __ne__ methods.
3348            (Classification.SetLayer): prevent recursion between this method
3349            and Layer.SetClassification().
3350    
3351            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
3352    
3353            * Thuban/Model/layer.py (SetClassification): prevent recursion
3354            between this method and Classification.SetLayer().
3355    
3356            * test/test_classification.py, test/test_load.py,
3357            test/test_session.py: Fixed and added tests for the classification
3358            classes.
3359    
3360    2003-03-06  Bernhard Herzog  <[email protected]>
3361    
3362            * Thuban/UI/classifier.py (ClassGrid.__init__)
3363            (ClassGrid.CreateTable): Move the SetSelectionMode call to
3364            CreateTable because otherwise it triggers an assertion in
3365            wxPython/wxGTK 2.4.
3366    
3367    2003-03-05  Jonathan Coles   <[email protected]>
3368    
3369            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
3370    
3371            * Thuban/Model/load.py: import FIELDTYPE constants from table.
3372    
3373            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
3374    
3375            * Thuban/Model/table.py: Put FIELDTYPE constants back.
3376    
3377    2003-03-05  Jonathan Coles   <[email protected]>
3378    
3379            * Thuban/UI/classifier.py: Added class documentation.
3380            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
3381            Store just the groups in the table and generate the other
3382            column information when it is requested. Add "None" field
3383            to pull-down to select no classification.
3384    
3385            * Thuban/common.py: Moved FIELDTYPE constants from table.py
3386            (Str2Num): Only catch ValueError exceptions.
3387    
3388            * Thuban/Model/classification.py: Class documentation. Renaming
3389            of methods with Stroke to Line. Groups are stored in a single
3390            list with the default as the first element. Groups are searched
3391            in the order they appear in the list.
3392    
3393            * Thuban/Model/color.py: Documentation.
3394    
3395            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
3396            the kind of data represented by a field.
3397    
3398            * Thuban/Model/load.py (ProcessSession): Use proper string
3399            conversion function; fixes RTbug #1713.
3400    
3401            * Thuban/Model/save.py (Saver): Store field type information.
3402    
3403            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
3404            (Table): Add field_info_by_name() to retrieve field information
3405            by specifying the field name, not the number.
3406    
3407            * Thuban/UI/mainwindow.py: Function name changes.
3408    
3409            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3410            get the layer classification once. Don't try to classify
3411            values when the field is None: just use the default properties.
3412    
3413            * Thuban/UI/view.py: Function name changes.
3414    
3415            * Doc/thuban.dtd: Add field_type attribute to a classification.
3416    
3417    2003-03-04  Bernhard Herzog  <[email protected]>
3418    
3419            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
3420            the fill and stroke layer attributes optional with suitable
3421            default values. Add the stroke_width layer attribute. Use correct
3422            syntax for empty elements. Make the attribute list for labels
3423            refer to the label element.
3424    
3425    2003-03-04  Bernhard Herzog  <[email protected]>
3426    
3427            * setup.py (thuban_build_py.build): Add a comment about distutils in
3428            Python 2.3 containing some of the functionality we implement in
3429            setup.py ourselves.
3430    
3431            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
3432            before the selection mode. Doing it the other way round triggers
3433            an assertion in wxWindows.
3434    
3435            * Thuban/Model/save.py (escape): Fix typo in doc-string
3436    
3437            * Thuban/Model/classification.py: Remove unnecessary wxPython
3438            import
3439    
3440    2003-03-04  Jonathan Coles   <[email protected]>
3441    
3442            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
3443            Parameter 'value' should default to None.
3444    
3445            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
3446            the class attribute __classification is now private.
3447    
3448            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
3449            Classifier to ClassGrid. Added support for removing selected rows,
3450            which including code for keeping track of when cells are selected,
3451            and deselected.
3452            (ClassTable): Support for added/removing rows. Fixed a problem
3453            with __ParseInput whereby it would not allow strings (only numbers)
3454            to be entered.
3455            (Classifier): Added button and supporting code for removing
3456            selected rows.
3457    
3458    2003-02-27  Jonathan Coles   <[email protected]>
3459    
3460            * Thuban/common.py: Moved color conversion functions into
3461            Thuban/UI/common.py.
3462            (Str2Num): Now converts the float (not the string) to a long/int
3463            so that an exception isn't thrown.
3464    
3465            * Thuban/UI/common.py: Common functions used in several UI modules
3466    
3467            * Thuban/Model/classification.py: Changed the class hierarchy
3468            so that a Classification consists of Groups which return
3469            Properties when a value matches a Group.
3470    
3471            * Thuban/Model/layer.py: Fixed name resolution problem.
3472    
3473            * Thuban/Model/load.py: Use new Classification and Group functions.
3474    
3475            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
3476            failure.
3477            (Saver.write_classification): Use new Classification and Group
3478            functions.
3479    
3480            * Thuban/UI/classifier.py: Changes to use new Classification and Group
3481            functions. Fix to create a tuple with a single value instead of
3482            simply returning the value.
3483    
3484            * Thuban/UI/renderer.py: Use new Classification and Group functions.
3485            Use common.py functions.
3486    
3487            * Thuban/UI/tree.py: Use common.py functions.
3488            
3489            * test/test_classification.py: Use new Classification and Group
3490            classes.
3491    
3492    2003-02-24  Jonathan Coles   <[email protected]>
3493    
3494            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
3495            functions from Thuban color objects to wxWindow colour objects.
3496    
3497            * Thuban/Model/classification.py (Classification): Renamed
3498            GetProperties() to GetClassData(). Used the new iterator
3499            in TreeInfo().
3500            (ClassIterator): Iterator implementation to iterate over the
3501            ClassData objects in a classification object.
3502    
3503            * Thuban/Model/save.py (Saver.write_classificaton): Uses
3504            the new iterator to save the classification information.
3505    
3506            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
3507            for changing the stroke and fill colors and previewing the
3508            changes.
3509    
3510            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
3511            MainWindow.SaveSessionAs): Text string changes so the dialogs
3512            have more meaningful titles.
3513    
3514            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
3515            Classification method name from GetProperties to GetClassData.
3516    
3517            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
3518            instead of accessing now non-existent class variables.
3519    
3520    2003-02-24  Bernhard Herzog  <[email protected]>
3521    
3522            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
3523            unneeded Shape() call. Rendering is substantially faster without
3524            it and it avoids some problems with broken shape files.
3525    
3526    2003-02-20  Frank Koormann   <[email protected]>
3527    
3528            Force minimal size of identify and label dialogs. The autosizing
3529            looked too ugly.
3530    
3531            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
3532            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
3533            Set size of listctrl.
3534            * Thuban/UI/identifyview.py (IdentifyView.__init__):
3535            Set size of dialog.
3536    
3537    2003-02-19  Jonathan Coles   <[email protected]>
3538    
3539            * test/test_classification.py, test/test_layer.py,
3540            test/test_load.py, test/test_map.py, test/test_session.py:
3541            Updated the tests to use the new functions that are in the
3542            respective classes.
3543    
3544            * Thuban/Model/classification.py (Classification):
3545            Uses the new ClassData* classes. Modification messages are
3546            passed up to the parent layer (if it exists).
3547            (ClassData): New class to encapsulate the common data in each
3548            classification property.
3549            (ClassDataDefault): Represents the Default class. data.
3550            (ClassDataPoint): Represents a single class. data point
3551            (ClassDataRange): Represents a class. range
3552            (ClassDataMap): Represents a class. map (unused).
3553    
3554            * Thuban/Model/color.py: Added Color.None to represent something
3555            with no color. Color.Black represents the color black.
3556            (NoColor): Helper class derived from Color to represent something
3557            with no color.
3558    
3559            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
3560            stroke_width attributes. Made the 'classification' attribute private.
3561            New methods for setting/getting the classification.
3562    
3563            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
3564            to get the classifcation and use the new ClassData* classes to
3565            hold the classification data. Use Str2Num to convert numbers
3566            properly.
3567    
3568            * Thuban/Model/save.py (Saver): Use new Color and Classification
3569            methods
3570    
3571            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
3572            custom grid.
3573            (ClassTable): Support for editing Values and Labels and for
3574            changing what type (point or range) of data is stored in each
3575            property based on how the user enters the data.
3576            (Classifier): Support for saving the new classifications and
3577            launching the dialog to edit a property.
3578            (SelectPropertiesDialog): New class for editing the visual
3579            properties of a classification (stroke color, width, and fill color)
3580            (ClassPreviewer): Took the Draw method from ClassRenderer and
3581            made most of it into this new class. Intend to use this class in
3582            the SelectPropertiesDialog for previewing changes.
3583    
3584            * Thuban/UI/renderer.py: Use new Color and Classification methods.
3585    
3586            * Thuban/UI/tree.py: Formatting changes.
3587    
3588            * Doc/thuban.dtd: Add 'label' element
3589    
3590            * Thuban/common.py: New. Contains common routines used throughout
3591            the code.
3592            (Str2Num): Takes a string and converts it to the "best" type of
3593            number.
3594    
3595    2003-02-14  Bernhard Herzog  <[email protected]>
3596    
3597            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
3598            dragging flag is always set to 0 even when the tool implementation
3599            raises an exception
3600    
3601    2003-02-11  Bernhard Herzog  <[email protected]>
3602    
3603            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
3604            method to create a splash screen.
3605            (ThubanApplication.ShowMainWindow): New. Show the main window.
3606            Needed so the splash screen can display the mainwindow
3607            (ThubanApplication.OnInit): Call the
3608            new splash_screen method to determine whether the application
3609            should display a splash screen. If it displays a splash screen do
3610            not immediately show the main window.
3611    
3612    2003-02-11  Jonathan Coles  <[email protected]>
3613    
3614            * Thuban/Model/classification.py: Added import line to fix
3615            feature conflicts between running on python2.2 and python2.1.
3616    
3617            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
3618            onto the clinfo parameter, so removed the deepcopy().
3619    
3620    2003-02-10  Jonathan Coles  <[email protected]>
3621    
3622            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
3623            Added element_open variable to track opening and closing of tags
3624            so that tags that don't span more than one line are closed with
3625            /> instead of </tag_name>. Use the GetDefault*() methods of
3626            the Classification class.
3627    
3628            * Thuban/Model/classification.py (Classificaton): Added set and
3629            get methods for the default data. The class also takes a layer
3630            reference so that modification messages can be sent. Fixed the
3631            methods to use the new ClassData class.
3632            (ClassData): New class to encapsulate the classification data
3633    
3634            * Thuban/Model/layer.py (Layer): Remove the
3635            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
3636            SetDefault*() methods on the layer's classification object.
3637            (Layer.__init__): Use the new SetDefault*() methods in the
3638            Classification class.
3639    
3640            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
3641            object instead of a dictionary.
3642    
3643            * Thuban/UI/classifier.py (ClassRenderer): New class to
3644            draw the classifications in the dialog box's table.
3645            (Classifier): Modified to use the ClassRenderer class.
3646    
3647            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
3648            methods of the Classification class.
3649    
3650            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
3651            of the ClassData class.
3652    
3653            * test/test_classification.py, test/test_layer.py,
3654            test/test_map.py, test/test_session.py: Fix the tests to work
3655            with the above code changes.
3656    
3657    2003-02-03  Jonathan Coles  <[email protected]>
3658    
3659            * Thuban/Model/classification.py (Classification): Added getNull()
3660            to return the NullData reference
3661    
3662            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
3663            Layer.SetStrokeWidth): Modified these functions to change the
3664            null data in the classification rather than keep these values
3665            directly in the Layer class. Menu options to change these values
3666            work again.
3667    
3668    2003-01-28  Jonathan Coles  <[email protected]>
3669    
3670            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
3671            Fixed crashing problem on some systems. Dialog box shows
3672            classification data.
3673    
3674            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
3675            Colors in the tree view.
3676    
3677            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
3678            the tree info for classifications. Commented out unnecessary lines.
3679    
3680            * Thuban/Model/classification.py (Classification.TreeInfo): New
3681            function to add information about the classification into the
3682            tree view.
3683    
3684    2003-01-27  Jan-Oliver Wagner <[email protected]>
3685    
3686            * Thuban/__init__.py (_): New.
3687    
3688            * Thuban/Model/classification.py, Thuban/Model/extension.py,
3689            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
3690            Thuban/Model/session.py, Thuban/UI/application.py,
3691            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
3692            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
3693            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
3694            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
3695            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
3696    
3697    2003-01-27  Jonathan Coles  <[email protected]>
3698    
3699            * Thuban/Model/layer.py: Classification initialization calls.
3700    
3701            * Thuban/Model/classification.py: Created class to encapsulate
3702            a layer classification. Supports specific data points and
3703            ranges.
3704    
3705            * Thuban/Model/load.py: Added support for loading classification
3706            information.
3707    
3708            * Thuban/Model/save.py: Added support for saving classification
3709            information.
3710    
3711            * Thuban/UI/classifier.py: Initial class for a dialog box for
3712            specifying classification information.
3713    
3714            * Thuban/UI/mainwindows.py: Support for opening the classifier
3715            dialog.
3716    
3717            * Thuban/UI/renderer.py: Support for drawing a layer with the
3718            classification information.
3719    
3720            * Data/iceland_sample_class.thuban: iceland_sample with
3721            classification data.
3722    
3723            * test/test_classification: Tests for the Classification class.
3724    
3725    2002-12-09  Bernhard Herzog  <[email protected]>
3726    
3727            * test/test_command.py: New. Tests for the command classes.
3728    
3729            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
3730            (Command.IsTool): New method to distinguish between command
3731            switching tools and other commands.
3732    
3733            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
3734            the tool to avoid direct assignments to instance variables
3735            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
3736            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
3737            change the tool
3738    
3739            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
3740            active tool's command turns insensitive, disable the tool.
3741            (_tool_command): Use the new ToolCommand class
3742    
3743            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
3744            SelectTool method to change the tool
3745            (iconfile): Use the ToolCommand class
3746    
3747    2002-12-03  Bernhard Herzog  <[email protected]>
3748    
3749            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
3750            the case of selected items that are not children of Layers or Maps
3751            properly. Previously this bug would trigger an assertion in
3752            wxWindows.
3753    
3754    2002-11-06  Frank Koormann  <[email protected]>
3755    
3756            * Thuban/UI/mainwindow.py: Altered the order of tools in the
3757            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
3758            Full Extent).
3759    
3760    2002-10-23  Bernhard Herzog  <[email protected]>
3761    
3762            * setup.py (setup call): version now 0.1.3
3763    
3764            * MANIFEST.in: Add the files in test/
3765    
3766            * test/README: Add note about tests requiring the iceland data
3767    
3768            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
3769            copyright notice.
3770    
3771    2002-10-18  Bernhard Herzog  <[email protected]>
3772    
3773            * test/test_map.py
3774            (TestMapWithContents.test_projected_bounding_box): Use an explicit
3775            epsilon.
3776    
3777            * test/support.py (FloatComparisonMixin.assertFloatEqual)
3778            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
3779            message if the assertion fails and don't return the return value
3780            of self.assert_. In assertFloatSeqEqual the return meant that not
3781            all items of the sequence were compared.
3782    
3783    2002-09-20  Bernhard Herzog  <[email protected]>
3784    
3785            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
3786    
3787            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
3788    
3789            * test/test_map.py (TestMapWithContents.test_tree_info): Create
3790            the string with the bounding box on the fly because of platform
3791            differences in the way %g is handled.
3792    
3793            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
3794            DBFfile too because Thuban layers can't yet cope missing DBF
3795            files.
3796    
3797    2002-09-20  Bernhard Herzog  <[email protected]>
3798    
3799            * test/test_menu.py: Use initthuban instead of
3800            add_thuban_dir_to_path to initialize Thuban.
3801    
3802            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
3803            Mixin class for float comparisons
3804            (SubscriberMixin): New. Mixin class to test messages sent through
3805            the Connector class
3806    
3807            * test/README: Fix a typo and add the -v flag to the command for
3808            individual tests
3809    
3810            * test/test_session.py: New. Test cases for Thuban.Model.session
3811    
3812            * test/test_proj.py: New. Test cases for Thuban.Model.proj
3813    
3814            * test/test_map.py: New. Test cases for Thuban.Model.map
3815    
3816            * test/test_layer.py: New. Test cases for Thuban.Model.layer
3817    
3818            * test/test_label.py: New. Test cases for Thuban.Model.label
3819    
3820            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
3821    
3822            * test/test_color.py: New. Test cases for Thuban.Model.color
3823    
3824            * test/test_base.py: New. Test cases for Thuban.Model.base
3825    
3826    2002-09-13  Bernhard Herzog  <[email protected]>
3827    
3828            * Thuban/Model/session.py (Session.forwarded_channels): Forward
3829            the CHANGED channel too.
3830    
3831            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
3832            CHANGED channel too.
3833            (Map.__init__): Call the Modifiable constructor as well.
3834    
3835            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
3836            event if the modified flag changes.
3837            (Modifiable.changed): Tweak the doc-string.
3838    
3839            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
3840            (MainWindow.set_position_text): Put the code that puts the text
3841            with the mouse position into the status bar into the new method
3842            set_position_text so that it can overwritten in derived classes.
3843    
3844    2002-09-12  Bernhard Herzog  <[email protected]>
3845    
3846            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
3847            message box on the main window.
3848    
3849    2002-09-11  Bernhard Herzog  <[email protected]>
3850    
3851            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
3852            the 'E' because it's less likely to interfere with other menu
3853            entries.
3854            (MainWindow.build_menu): remove an incorrect comment.
3855    
3856    2002-09-10  Bernhard Herzog  <[email protected]>
3857    
3858            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
3859            (_tool_command): Add sensitive parameter
3860            (_has_visible_map): Sensitivity callback to tools and other
3861            commands that require a visible map. Use it in map_zoom_in_tool,
3862            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
3863            and map_full_extent
3864    
3865    2002-09-06  Bernhard Herzog  <[email protected]>
3866    
3867            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
3868            VIEW_POSITION
3869    
3870    2002-09-04  Frank Koormann  <[email protected]>
3871    
3872            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
3873    
3874    2002-09-02  Bernhard Herzog  <[email protected]>
3875    
3876            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
3877            wxWindows already and our implementation doesn't work correctly
3878            with wxGTK 2.3:
3879            (MapCanvas.__init__): Remove the instance variable
3880            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
3881            be drawin
3882            (MapCanvas.OnIdle): Removed.
3883    
3884            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
3885            a parameter to determine the size of the rectangle.
3886            (MapCanvas.find_shape_at): Create the box around the point on a
3887            layer by layer basis and make the size depend on the shape type.
3888            This solves a problem with the selection of point shapes at the
3889            border of the layer's bounding box
3890    
3891    2002-08-30  Bernhard Herzog  <[email protected]>
3892    
3893            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
3894            for the sensitivity  of remove layer.
3895            (_can_remove_layer): New. Sensitivity callback for remove layer
3896            (Command layer_remove): Use _can_remove_layer
3897    
3898            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
3899            determine whether a given layer can be deleted.
3900    
3901            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
3902            (MapCanvas.do_redraw): Get rid of the unused update_region
3903            instance variable
3904    
3905            * Thuban/UI/view.py: Add/update some doc-strings.
3906    
3907            * test/: new subdirectory with a bunch of unit tests.
3908    
3909            * test/README, test/test_table.py, test/test_save.py,
3910            test/test_menu.py, test/test_load.py: Initial set of tests and
3911            brief instructions on how to run them
3912    
3913    2002-08-29  Bernhard Herzog  <[email protected]>
3914    
3915            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
3916            arcs with multiple parts.
3917    
3918            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
3919            Handle degenrate rectangles.
3920    
3921            * Thuban/Model/table.py: Make writing records work correctly:
3922            (Table.__init__): Keep track of whether the DBF is open for
3923            writing
3924            (Table.write_record): Open the DBF file for writing when necessary
3925    
3926    2002-08-27  Bernhard Herzog  <[email protected]>
3927    
3928            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
3929            dbf files only for reading by default. Use a new writable dbf
3930            object for writing.
3931    
3932  2002-08-26  Bernhard Herzog  <[email protected]>  2002-08-26  Bernhard Herzog  <[email protected]>
3933    
3934            * Thuban/UI/mainwindow.py: Refactor the context creation:
3935            (MainWindow.Context): New method to return a context
3936            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
3937            new method
3938    
3939          * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the          * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
3940          layer table specific code from TableGrid into LayerTableGrid          layer table specific code from TableGrid into LayerTableGrid
3941          (TableFrame, LayerTableFrame): Split the layer table specific code          (TableFrame, LayerTableFrame): Split the layer table specific code
3942          from TableFrame into LayerTableFrame          from TableFrame into LayerTableFrame
3943            (LayerTableGrid.select_shape): Remove a debug print
3944    
3945          * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the          * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
3946          LayerTableFrame          LayerTableFrame
# Line 17  Line 3954 
3954    
3955          * Thuban/Model/table.py (Table.write_record): New method to write          * Thuban/Model/table.py (Table.write_record): New method to write
3956          records.          records.
3957          (Table.__init__): Open the DBF file for writing too.          (Table.__init__): Open the DBF file for writing too.
3958    
3959          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
3960          into the underlying table.          into the underlying table.
# Line 55  Line 3992 
3992          * setup.py (ThubanInstall.run): Don't repr install_lib_orig          * setup.py (ThubanInstall.run): Don't repr install_lib_orig
3993          because thubaninit_contents will do it for us.          because thubaninit_contents will do it for us.
3994    
3995  2002-08-16      Jan-Oliver Wagner <[email protected]>  2002-08-16  Jan-Oliver Wagner <[email protected]>
3996    
3997          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
3998          tree window already open          tree window already open
# Line 183  Line 4120 
4120          * Thuban/UI/tree.py: We can now simply subscribe to the session's          * Thuban/UI/tree.py: We can now simply subscribe to the session's
4121          CHANGED channel to be informed of changes.          CHANGED channel to be informed of changes.
4122          (SessionTreeCtrl.session_channels): Not needed any longer.          (SessionTreeCtrl.session_channels): Not needed any longer.
4123          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
4124          Only have to (un)subscribe CHANGED          Only have to (un)subscribe CHANGED
4125    
4126          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
# Line 244  Line 4181 
4181          * Thuban/Model/layer.py (Layer.TreeInfo),          * Thuban/Model/layer.py (Layer.TreeInfo),
4182          Thuban/Model/extension.py (Extension.TreeInfo),          Thuban/Model/extension.py (Extension.TreeInfo),
4183          Thuban/Model/map.py (Map.TreeInfo),          Thuban/Model/map.py (Map.TreeInfo),
4184          Thuban/Model/session.py (Session.TreeInfo):          Thuban/Model/session.py (Session.TreeInfo):
4185          Add TreeInfo methods to implement the new tree view update scheme          Add TreeInfo methods to implement the new tree view update scheme
4186    
4187  2002-07-16  Bernhard Herzog  <[email protected]>  2002-07-16  Bernhard Herzog  <[email protected]>
# Line 325  Line 4262 
4262          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
4263          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
4264    
4265  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
4266    
4267          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
4268          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 554  Line 4491 
4491          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
4492          position in the statusbar          position in the statusbar
4493    
4494  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
4495    
4496          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
4497    
4498  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
4499            
4500          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
4501    
4502          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
4503    
4504          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
4505    
4506            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
4507            box
4508    
4509  2002-04-21      Jan-Oliver Wagner <[email protected]>  2002-04-21  Jan-Oliver Wagner <[email protected]>
4510    
4511          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
4512    
4513          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
4514    
4515          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
4516          icon; added map_full_extend as tool          icon; added map_full_extend as tool
4517    
4518  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
4519    
4520          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
4521          saving _new_ sessions          saving _new_ sessions
# Line 679  Line 4617 
4617    
4618          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
4619          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
4620    
4621  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
4622    
4623          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
4624          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
4625    
4626          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
4627          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
4628          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
4629          too.          too.
# Line 796  Line 4733 
4733          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
4734          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
4735    
4736          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
4737          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
4738          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
4739          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
4740          the application's OnInit method          the application's OnInit method
# Line 813  Line 4750 
4750          layer to the tableview dialog.          layer to the tableview dialog.
4751    
4752          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
4753          (TableGrid):          (TableGrid):
4754          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
4755          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
4756          (TableFrame.__init__):          (TableFrame.__init__):
# Line 880  Line 4817 
4817  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
4818    
4819          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
4820            
4821          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
4822          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
4823            
4824          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
4825          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
4826          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 930  Line 4867 
4867          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
4868          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
4869          link_file method          link_file method
4870            
4871          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
4872          the window when the first layer is added to the map.          the window when the first layer is added to the map.
4873    
# Line 967  Line 4904 
4904          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
4905          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
4906          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
4907            
4908          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
4909          installer          installer
4910    

Legend:
Removed from v.278  
changed lines
  Added in v.1237

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26