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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1299 - (show annotations)
Tue Jun 24 18:00:36 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 204161 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26