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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1294 - (show annotations)
Mon Jun 23 13:06:13 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 203735 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26