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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1270 - (show annotations)
Fri Jun 20 16:10:40 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 200229 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26