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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 817 - (show annotations)
Mon May 5 15:05:36 2003 UTC (21 years, 10 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 119487 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26